首页 > 解决方案 > 为什么 MySQL 中的这个查询不使用索引?

问题描述

当我学习如何使索引在 MySQL 中表现更好时,我看到了一个例子:

如果您像这样创建连接索引:(col1,col2);并且您的查询是这样的:从 col1 = 'col1' order by col2 的表中选择 col3。引擎不会使用连接索引对数据进行排序。你应该排序:从表中选择 col3,其中 col1 = 'col1' order by col1,col2;

但我对上面的例子感到困惑:如果我创建 (col1,col2) ,这意味着 B + 树将首先按 col1 排序索引,当 col1 相同时,它会考虑 col2。

所以在这个查询中我们有 col1 = 'col1',所以我认为引擎只是通过连接索引顺序获取数据,然后数据自然会按 col2 排序。

我错了还是这个例子错了?也希望有人能推荐一篇关于如何更好地使用索引的文章,而不是教什么是索引以及如何添加索引,

标签: mysqlindexing

解决方案


这对我有用:

select col3 from table
    where col1 = 'col1'
    order by col2

with 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.

以及您提供的报价的链接。


推荐阅读