暂无图片
暂无图片
8
暂无图片
暂无图片
暂无图片

SQL优化实战之三星索引理解

原创 aisql 2023-02-03
2009

理论

如果一个索引满足三星索引的三个条件就是最好的索引了
要满足哪三个条件才能称为三星索引呢?
1、索引的区分度很高
2、索引的排序和业务查询的排序相同
3、索引的字段完全满足查询的需要

实战

昨天接到一个朋友求助。说一个SQL很奇怪。加一个and like条件后 语句执行速度变慢了很多

我让他把执行计划发出来看看,执行计划为下

b0a561b3a6931c3fb0f3e096c91235e.png

于是我问他 a.project_id列上没有索引吗?
image.png

得到的回复是有

他发了a表的索引情况出来
625787098755e8f18cddb40a62af3eb.png

语句要优化就简单多了。直接给他说让语句强制走project_id 索引,速度肯定就快了
image.png

我们来分析一下为什么MySQL走错了索引。

从目前已有索引来说。 这个语句,要么满足上面的条件1区分度 走索引project_id ,要么满足条件2以排序为首先。 不可能两者都满足,而MySQL认为排序可能开销更大,所以选择了满足条件2

image.png

由于这个查询输出了很多a表字段,不太可能满足三星索引的条件3了,但我们可以让这个SQL满足三星的条件1与条件2
image.png

建立一个 project_id,report_time的联合索引 即可以有很好的区分度,索引的排序也正好是SQL的排序

结论

我们建索引的时候,一定想尽量满足上述三星索引的三个条件,但实际困难,但至少得满足其中一条,不然这个索引就没有什么意义
反过来。我们优化SQL的时候,也往三星索引思想上靠,就能优化好SQL了。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论