情况2:从phone开始查询,type=All,key=null,未使用索引
情况3:从name开始,type=ref,使用了索引
3.范围条件放最后
没有使用范围查询,key_len=197,使用到了name+age+phone组合索引
EXPLAIN SELECT * FROM student WHERE NAME = '泰罗' AND age = 1000 AND phone = '15717177664';
使用了范围查询,key_len从197变为158,即除了name和age,phone索引失效了
EXPLAIN SELECT * FROM student WHERE NAME = '泰罗' AND age > 800 AND phone = '15717177664';
key_len=name(153)+age(5)
4.不在索引列上做任何操作
EXPLAIN SELECT * FROM student WHERE NAME = '泰罗'; EXPLAIN SELECT * FROM student WHERE left(NAME,1) = '泰罗';
不做计算,key_len有值,key_len=153,有使用name索引
做了截取结算,type=All,key_len=null,未使用索引
5.不等于要甚用
mysql 在使用不等于 (!= 或者 <>) 的时候无法使用索引会导致全表扫描
#有使用到索引 EXPLAIN SELECT * FROM student WHERE NAME = '泰罗'; #不等于查询,未使用到索引 EXPLAIN SELECT * FROM student WHERE NAME != '泰罗'; EXPLAIN SELECT * FROM student WHERE NAME <> '泰罗'; #如果定要需要使用不等于,请用覆盖索引 EXPLAIN SELECT name,age,phone FROM student WHERE NAME != '泰罗'; EXPLAIN SELECT name,age,phone FROM student WHERE NAME <> '泰罗';
使用不等于查询,跳过索引
使用不等于查询,同时使用覆盖索引,此时可以使用到索引
6.Null/Not null有影响
修改为非空
那么为not null,此时导致索引失效
EXPLAIN select * from student where name is null; EXPLAIN select * from student where name is not null;
改为可以为空
查询为空,索引起作用了
查询非空索引失效
解决方法:
使用覆盖索引(覆盖索引解千愁)
7、Like 查询要当心 like
以通配符开头 ('%abc...')mysql 索引失效会变成全表扫描的操作
#like 以通配符开头('%abc...')mysql 索引失效会变成全表扫描的操作 #索引有效 EXPLAIN select * from student where name ='泰罗'; #索引失效 EXPLAIN select * from student where name like '%泰罗%'; #索引失效 EXPLAIN select * from student where name like '%泰罗'; #索引有效 EXPLAIN select * from student where name like '泰罗%'; 解决方式:覆盖索引 EXPLAIN select name,age,phone from student where name like '%泰罗%';
使用覆盖索引能够解决
8.字符类型加引号
字符串不加单引号索引失效(这个看着有点鸡肋了,一般查询字符串都会加上引号)
使用覆盖索引解决
三、优化3
1.OR 改 UNION 效率高
未使用索引 EXPLAIN select * from student where name='泰罗' or name = '雷欧'; 使用索引 EXPLAIN select * from student where name='泰罗' UNION select * from student where name = '雷欧'; 解决方式:覆盖索引 EXPLAIN select name,age from student where name='泰罗' or name = '雷欧';
使用or未使用到索引
使用union,使用了索引
解决方式:覆盖索引
到此这篇关于MySQL常见优化方案汇总的文章就介绍到这了,更多相关MySQL优化方案内容请搜索
更多SQL内容来自木庄网络博客