mysql - 为什么 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 排序。
我错了还是这个例子错了?也希望有人能推荐一篇关于如何更好地使用索引的文章,而不是教什么是索引以及如何添加索引,
解决方案
这对我有用:
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.
以及您提供的报价的链接。
推荐阅读
- python - An error happens in my wordnet python code: IndexError; List index out of range
- pytorch - What is the correct way to implement gradient accumulation in pytorch?
- excel - 我们可以在 VBA 中分配 Win + D 函数吗?
- azure-logic-apps - 使用相同的服务总线队列项重试逻辑应用
- android - 在 dispose() 之后调用 setState():_StatefulBuilderState#09642(生命周期状态:已失效,未安装)
- javascript - 如何仅滚动固定区域,而不是整个页面 onClick?
- python - json到pandas数据框,第一列值在所有行中都相同
- kubernetes - k8s - pod可以ping外部IP,但不能wget?
- linux - 如何创建一个从 csv 文件读取输入的 bash 脚本
- google-bigquery - BigQuery 验证器检测到错误,但 Query 成功运行