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

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

原创 aisql 2023-02-03
2908

理论

如果一个索引满足三星索引的三个条件就是最好的索引了
要满足哪三个条件才能称为三星索引呢?
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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论

倾辰。
暂无图片
2年前
评论
暂无图片 0
这么强吗?那为啥不创建3个字段的索引 project_id,phone,report_time;有啥依据吗
2年前
暂无图片 点赞
5
chengang
暂无图片
2年前
回复
暂无图片 0
两个原因 1、project_id 已有充分的区分度了。 2、加了phone反而索引的顺序和语句的排序不一致了。会更慢。
2年前
暂无图片 点赞
回复
倾辰。
暂无图片
2年前
回复
暂无图片 0
@aisql where条件后面不就是project_id,phone,report_time这样的顺序吗?单纯根据这块没法说 判断出project_id有充分的区分度,没看到证据;正常来说是不是就是需要order by后面的report_time索引,但是这个执行很慢,那就是要考虑复合索引,是这样吧,我是这样理解的;
2年前
暂无图片 点赞
回复
chengang
暂无图片
2年前
回复
暂无图片 0
@倾辰。哎。要专门给你讲课了, 看是否索引顺序是否是语句顺序要根据where+ order by来看。 如果还不明白。为什么加了我说的索引后,索引顺序即是这个语句顺序,欢迎小窗我。
2年前
暂无图片 点赞
回复
倾辰。
暂无图片
2年前
回复
暂无图片 0
@aisql 留言板功能好像有些问题的,你上面说的这个问题 我还真的不清楚,麻烦耽误您时间指导一哈
2年前
暂无图片 点赞
回复
A
asial
暂无图片
2年前
回复
暂无图片 0
@aisql 我也不太清楚,请大佬麻烦直接在这说一下呗
2年前
暂无图片 点赞
回复
Qin
暂无图片
2年前
评论
暂无图片 0
2年前
暂无图片 点赞
评论
暂无图片
2年前
评论
暂无图片 0
2年前
暂无图片 点赞
评论
严少安
暂无图片 暂无图片
2年前
评论
暂无图片 0
⭐⭐⭐
2年前
暂无图片 点赞
评论