Mysql —— 索引的使用顺序

Mysql —— 索引的使用顺序,第1张

创建表

该表的记录如下:

添加两个索引

通过 explain 来查看:

会命中两条索引,但实际只用了 idx_v1,即使实际查询用联合索引更好,也依然只用了 idx_v1。

之前的测试,发现用的是第一个,我们删除索引,把之前的索引语句顺序换一下:

发现用的是第一个。

MySQL的复合索引可以创建多个,每个复合索引可以包含一列或多列。复合索引使用的基本原则是左侧对齐原则。例如,复合索引包含A,B,C字段,实际相当于创建了5个索引,即:

那么问题来了,如果我们创建两个复合索引,复合索引1:包含A,B,C列和复合索引2:包含B,C列,MySQL如何执行呢?

按照正常的逻辑,和复合索引的原则,应该能命中的索引是A_B_C_index,让我们拭目以待吧!

结果:和上次测试的不一致,这次虽然包含ABC三个列,但命中的索引是B_C_index

重要结论:当命中两个或者多个不同的复合索引时,按照创建顺序不同,MySQL会有不同策略来选取其中的一个复合索引。

原始sql

他的执行计划

可见,这个sql执行过程是被命中索引了的,索引如下

这个索引创建的稍微有点问题,在查询筛选中,如果用到了范围查询,在创建联合索引的时候,应该尽量把需要范围查询的字段放在最后

在上面创建的索引中,首先命中 f_start_time 字段索引,由于他是当前联合索引的第一个字段,那么他就不会在去走索引的第二个字段了;

他的执行过程是先通过索引查询出符合时间范围的数据,由引擎返回给服务器,然后服务器再执行where条件筛选,故在extra中出现了 using where

为了解决这个问题,创建这个索引的过程应该是本着让索引命中更多列的原则,把startTime字段放在联合索引的最后,优化后的索引如下:


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5911317.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-08
下一篇 2023-03-08

发表评论

登录后才能评论

评论列表(0条)

保存