为啥 MySQL 中的这个查询不使用索引?
Posted
技术标签:
【中文标题】为啥 MySQL 中的这个查询不使用索引?【英文标题】:why this query in MySQL do not use index?为什么 MySQL 中的这个查询不使用索引? 【发布时间】:2021-12-17 14:53:54 【问题描述】:当我在学习如何使索引在 mysql 中表现更好时,我看到了一个例子:
如果您像这样创建连接索引:(col1,col2);并且您的查询是这样的:从 col1 = 'col1' order by col2 的表中选择 col3。引擎不会使用连接索引对数据进行排序。您应该排序如下: select col3 from table where col1 = 'col1' order by col1,col2;
但我对上面的例子感到困惑:如果我创建 (col1,col2) ,这意味着 B + 树将首先按 col1 排序索引,当 col1 相同时,它会考虑 col2。
所以在这个查询中我们有 col1 = 'col1',所以我认为引擎只是通过连接索引顺序获取数据,然后数据自然会按 col2 排序。
我错了还是这个例子错了?也希望有人能推荐一篇关于如何更好地使用索引的文章,而不是教什么是索引以及如何添加索引,
【问题讨论】:
一切都比描述的复杂。请参阅dbfiddle.uk/…(甚至这个小提琴也没有涵盖所有可能的情况)。完整的解释太长了。研究执行计划的构建和优化。 好的,我会认真看链接的,谢谢。 在那个 dbfiddle... 前两个解释是相同的,但这并不能证明它们将具有相同的速度。 (解释不够详细。)其余大部分查询涉及 Where 或 Order by 中的两个“范围”;在大多数情况下,这会破坏索引的有效使用。 【参考方案1】:这对我有用:
select col3 from table
where col1 = 'col1'
order by col2
与INDEX(col1, col2)
(称为“复合索引”)
我同意你的观点,而不是引用。
要找出问题所在,请提供
SHOW CREATE TABLE `table` -- so we can see exact datatypes and index
SHOW TABLE STATUS LIKE 'table'; -- to see sizes
EXPLAIN SELECT ...; -- to see what the Optimizer decide was best
EXPLAIN FORMAT=JSON select ...; -- more details
FLUSH STATUS;
SELECT ...;
SHOW SESSION STATUS LIKE 'Handler%'; -- to get still more details.
以及您提供的报价链接。
【讨论】:
以上是关于为啥 MySQL 中的这个查询不使用索引?的主要内容,如果未能解决你的问题,请参考以下文章
MySQL 专家:为啥 2 个查询给出不同的“解释”索引使用结果?