答案:使用EXPLAIN命令分析执行计划,重点观察type、key、rows和Extra列,结合Handler状态变量和optimizer_trace等工具综合判断索引使用效率。

要判断一个MySQL查询是否使用了索引,最直接、最权威的手段就是使用
EXPLAIN
EXPLAIN
SELECT
INSERT
UPDATE
DELETE
EXPLAIN
EXPLAIN SELECT * FROM products WHERE category_id = 10 AND price > 100 ORDER BY created_at DESC;
观察
EXPLAIN
type
const
eq_ref
ref
range
const
range
index
ALL
ALL
possible_keys
key
NULL
key_len
rows
Extra
Using index
Using where
WHERE
Using index
WHERE
Using where
type
ALL
WHERE
Using filesort
Using temporary
GROUP BY
DISTINCT
在我看来,如果你看到
type
ALL
key
NULL
Extra
Using filesort
Using temporary
EXPLAIN
解读
EXPLAIN
首先,
type
const
eq_ref
ref
range
const
eq_ref
range
rows
index
ALL
其次,
rows
rows
rows
type
ALL
再来,
Extra
Using index
Using filesort
ORDER BY
Using temporary
GROUP BY
DISTINCT
最后,
key_len
key_len
INDEX(col1, col2, col3)
key_len
col1
col2
col3
综合来看,一个高效的索引使用,通常会表现为:
type
const
eq_ref
ref
range
key
rows
Extra
Using index
Using filesort
Using temporary
这是一个非常常见的困惑,也是优化工作中经常遇到的挑战。我见过太多开发者,明明为某个列创建了索引,但查询性能依然不佳,一查
EXPLAIN
一个主要原因是索引选择性(Cardinality)太低。如果一个列的唯一值很少,比如一个性别字段(男/女),即使你为它创建了索引,MySQL也可能认为扫描整个表(
ALL
其次,数据分布不均也会影响索引使用。比如,一个字段大部分值都是
NULL
NULL
NULL
NULL
查询条件不符合“最左前缀原则”是另一个大坑。对于复合索引
INDEX(col1, col2, col3)
col2
col3
col1
WHERE col2 = 'abc'
col1
隐式类型转换也是个隐形杀手。如果你对一个字符串类型的列(比如
VARCHAR
WHERE string_col = 123
string_col
OR
OR
OR
Using union
负向查询条件,如
NOT IN
!=
<>
NOT LIKE
函数操作在
WHERE
WHERE YEAR(date_col) = 2023
date_col
YEAR(date_col)
最后,有时是优化器本身的决策。MySQL优化器是一个复杂的成本模型,它会综合考虑索引大小、数据量、数据分布、内存情况等多种因素来估算不同执行路径的成本。即使存在索引,如果优化器评估全表扫描的成本更低(例如,要返回的行数占总行数的比例很高),它也可能选择不使用索引。这不一定是优化器“错了”,而是它基于当前统计信息做出的“最佳”选择。
EXPLAIN
虽然
EXPLAIN
我经常会用到
SHOW STATUS
Handler_
Handler_read_key
Handler_read_rnd_next
Handler_read_key
Handler_read_rnd_next
Handler_read_rnd_next
对于更深入地理解优化器如何做出决策,尤其是当
EXPLAIN
optimizer_trace
使用
optimizer_trace
SET optimizer_trace='enabled=on';
SELECT * FROM information_schema.optimizer_trace;
SET optimizer_trace='enabled=off';
optimizer_trace
此外,MySQL 5.7及更高版本提供的
sys
sys.schema_table_statistics_with_buffer
sys.schema_index_statistics
这些工具结合起来,能让我们从不同粒度、不同维度去监控和分析MySQL的索引使用情况,从单个查询的微观优化到整个数据库的宏观性能调优,都能提供有价值的洞察。
以上就是如何判断一个MySQL查询是否使用了索引?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号