mysql优化相关知识

本文主要针对sql索引优化做出实践验证

一、常见的语句优化
这里不做多的阐述,因为都是些常规的索引优化手段,想必大家都很清楚以及确定如何使用
1.like最左匹配原则
2.用exists和not exists代替in和not in
3.union all代替or
4.不要在索引列上做任何操作,比如计算、函数、类型转换等,会导致索引失效
5.尽量避免使用select *
6.能用between and不用in
7.尽量用>=代替>

二、联合索引的使用
现有表mat_order订单表,联合索引由(rphone, order_id, money)组成
针对这个联合索引,我们测试一下,什么情况下会走索引,这里对explain的使用以及字段说明不做过多解释,大家可以自行百度
1.单个字段查询
explain select * from mat_order where order_id like '20200804141149%';
3.jpg
以上explain结果得知,只有第一个sql的order_id查询走了索引,与预期的一致,因为mysql的最左匹配原则,所以只有order_id的查询会走索引

2.多个字段查询
这里用到联合索引的覆盖索引
explain select * from mat_order where rphone like '1862%' and order_id like '20200804141149%';
6.jpg
可以看到这里用了rphone和order_id的组合索引

explain select * from mat_order where order_id like '20200804141149%' and rphone like '1862%';
7.jpg
将rphone和order_id的顺序调整,依然会走rphone和order_id的组合索引

explain select * from mat_order where order_id like '20200804141149%' and money > 20000;
8.jpg
如果只有order_id和money字段查询,则不会走索引,依据最左原则,匹配不到

explain select * from mat_order where rphone like '1862%' and money > 20000;
9.jpg
这个sql依然走了索引,但只是走了rphone的单列索引,通过ken_len的长度可以判断出,与走单个rphone索引的ken_度一致,并没有走rphone和money的组合索引

explain select * from mat_order where rphone like '1862%' and money > 20000 and order_id like '20200804141149%';
10.jpg
组合的所有列都在where语句中,会走全组合索引,效率也是最高的

三、mysql查询数据30%的设置
mysql内部有设置,当我们的sql查询出的数据大于30%时,即使sql语句满足索引的条件,依然不会走索引,会进行全表扫描

explain select * from mat_order where rphone like '1862%';
15.jpg

explain select * from mat_order where rphone like '186%';
16.jpg

以上两个一样的sql,只因查询条件值不一样,一个走索引,一个全表扫描,因为第二个sql查询出的数据大于全表数据的30%,则走索引的效率还不如全表扫描,则索引会失效

四、总结
1.sql是否会走索引,除了sql本身符合索引规则外,还需要看查询的数量占全表数据比,大于30%则不会走索引
2.联合索引的查询,只要where条件后面的语句是联合索引覆盖到的,则都会走索引,与where条件的顺序无关,因为执行器会优化

你可能感兴趣的:(mysql,java,后端,程序员)