数据库表的优化

一、两表优化

两表建立左右连接要考虑性能问题,建索引记住左连接时mysql先考虑如何右表搜索行,右连接同理,规律是:左表连右表,右表建索引,右表连左表,左表建索引

二、三表优化

采用左关联两张表时,要在主表对应的外表字段建立索引

比如 select * from user lefit join order on user.cid=order.cid left join balance b on order.time=b.time;

对order的cid加索引和b.time

Alter table ‘order’add index z(‘cid’);

Alter table ‘balace index z(‘time’);

  • 三、避免索引失效

  • 1、全值匹配  Alter table ‘user index z(‘name’,’age’,’phone’);

    多个索引列同时查询ok的,当name,phone查询索引部分使用到,name使用到索引,phone索引失效。

    2、最佳左前缀

    如果索引多个列,要遵守最左前缀法则,就是查询从最左索引开始,不能跳过左边索引列

    比如: Alter table ‘user index z(‘name’,’age’,’phone’);

    查询使用select *from user where age=1;失效,要保证有name,才能根据后面条件进行查询

    3、不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描。

    比如:select *from user where left(name,4)=’yygs’; name索引失效

    数据库表的优化

  • 存储引擎不能使用索引中范围条件右边的列
  • 比如:select *from user u where u.name=’jack’ and age>10;

    Type达到range级别,索引失效,范围查询增加了查询程度;

    5、尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少select *

    6、mysql在使用不等于或<>时候导致索引失效

    7、is null,is not null也无法使用索引

    8、like以通配符开头(%abc..)mysql索引失效

    数据库表的优化

    未建立索引情况下like ‘%name%’,全文扫码

    单独左边百分号用不上索引,右边百分号会用到索引range级别

    强制双边都有百分号,要求使用覆盖索引,建立索引为name,age,双边查询时使用

    Select name,age from user where name like ‘%张三%’;索引生效

    Select name,age,email from user where name like ‘%张三%’;索引失效

    Select name,age,id from user where name like ‘%张三%’;索引生效

    9、字符串不加单引号索引会失效

    数据库表的优化

    Select * from user where name=’yyg’索引生效,name已建立索引

    Select * from user where name=yyg索引失效,mysql底层做了隐式类型转换,name已建立索引

    10、少用or,用它连接时索引失效

    数据库表的优化

    数据库表的优化

    最后一个出现了filesort,比较严重,mysql内部强制排序查询

    数据库表的优化 数据库表的优化 数据库表的优化