sql优化实战
-
全值匹配
联系联合索引原理
EXPLAIN SELECT * FROM employees WHERE age = 22 AND position ='manager';
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wkwJIECn-1650216677819)(E:\file\学习\课后总结\MySQL\assert\image-20220418003554360.png)]
EXPLAIN SELECT * FROM employees WHERE name= 'LiLei';
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MzXbtLb3-1650216677823)(E:\file\学习\课后总结\MySQL\assert\image-20220418003331051.png)]
EXPLAIN SELECT * FROM employees WHERE name= 'LiLei' AND age = 22;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Erv1XTHY-1650216677827)(E:\file\学习\课后总结\MySQL\assert\image-20220418003422072.png)]
EXPLAIN SELECT * FROM employees WHERE name= 'LiLei' AND age = 22 AND position ='manager';
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N7TQ6WZV-1650216677828)(E:\file\学习\课后总结\MySQL\assert\image-20220418003505242.png)]
-
范围查询优化
explain select * from employees where age >=1 and age <=2000;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Maxf9vtj-1650216677829)(E:\file\学习\课后总结\MySQL\assert\image-20220418004101904.png)]
没走索引原因:mysql内部优化器会根据检索比例、表大小等多个因素整体评估是否使用索引。比如这个例子,可能是由于单次数据量查询过大导致优化器最终选择不走索引。
优化方法:将大的范围拆分成多个小范围
explain select * from employees where age >=1 and age <=22; explain select * from employees where age >=23 and age <=2000;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-V3LZz2T7-1650216677831)(E:\file\学习\课后总结\MySQL\assert\image-20220418004759763.png)]
-
最左前缀法则
如果索引了多列,要遵守最左前缀法则。也就是说查询从索引的最左前列开始并且不跳过索引中的列。
-
不要在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描
explain SELECT * FROM employees WHERE left(name,3) = 'LiL';
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AvRsW9WD-1650216677832)(E:\file\学习\课后总结\MySQL\assert\image-20220418005927309.png)]
-
尽量使用覆盖索引(只访问索引的查询(索引列包含查询列)),减少 select * 语句
-
mysql在使用不等于(!=或者<>),not in ,not exists 的时候无法使用索引会导致全表扫描
explain select * from employees where id not in (1,5,9);
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AVnn1fyT-1650216677833)(E:\file\学习\课后总结\MySQL\assert\image-20220418010740453.png)]
< 、 > 、 <=、>= 这些,mysql内部优化器会根据检索比例、表大小等多个因素整体评估是否使用索引
explain select * from employees where age >=1 and age <=2000;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-itF7iEm6-1650216677834)(E:\file\学习\课后总结\MySQL\assert\image-20220418004101904.png)]
-
is null,is not null 一般情况下也无法使用索引
explain select id from employees where name is null;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KYcmOMS6-1650216677835)(E:\file\学习\课后总结\MySQL\assert\image-20220418010407964.png)]
-
like以通配符开头mysql索引失效会变成全表扫描操作
explain select * from employees where name like '%y%';
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QCVL9wk1-1650216677836)(E:\file\学习\课后总结\MySQL\assert\image-20220418010615205.png)]
explain select * from employees where name like 'y%';
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jFDzcMsL-1650216677840)(E:\file\学习\课后总结\MySQL\assert\image-20220418010838816.png)]
-
字符串不加单引号索引失效
explain select * from employees where name = 1;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zM2sfV1V-1650216677843)(E:\file\学习\课后总结\MySQL\assert\image-20220418011058957.png)]
explain select * from employees where name = '1';
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ea0M2gjx-1650216677844)(E:\file\学习\课后总结\MySQL\assert\image-20220418011126295.png)]
-
少用or或in,用它查询时,mysql不一定使用索引,mysql内部优化器会根据检索比例、表大小等多个因素整体评估是否使用索引,详见范围查询优化
explain select * from employees where name = '1' or name = '2';
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EhHkE4ra-1650216677845)(E:\file\学习\课后总结\MySQL\assert\image-20220418011236428.png)]
ql
explain select * from employees where name = ‘1’ or name = ‘2’;
[外链图片转存中...(img-EhHkE4ra-1650216677845)]