登录
首页 >  数据库 >  MySQL

mysql优化相关知识

来源:SegmentFault

时间:2023-02-24 13:42:55 494浏览 收藏

对于一个数据库开发者来说,牢固扎实的基础是十分重要的,golang学习网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《mysql优化相关知识》,主要介绍了MySQL、Java、后端、程序员,希望对大家的知识积累有所帮助,快点收藏起来吧,否则需要时就找不到了!

本文主要针对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%';
A33E22209878593EF4B9413B01D24239.jpg

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

explain select * from mat_order where money > 20000;
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条件的顺序无关,因为执行器会优化

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于数据库的相关知识,也可关注golang学习网公众号。

声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>