为啥 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:为啥简单查询不使用索引,执行文件排序

请教mysql模糊查询两边都用%为啥用不到索引?

为啥 MySQL 不使用我的索引进行 JOIN?

MySQL 专家:为啥 2 个查询给出不同的“解释”索引使用结果?

为啥 Mysql JOIN Query - Full SCAN 不使用索引

为啥查询不使用Oracle中的索引