mysql中如何查看是否用到了索引?
1. 使用 EXPLAIN 命令(最常用)
在 SQL 语句前添加 EXPLAIN 关键字,分析执行计划:
EXPLAIN SELECT * FROM your_table WHERE indexed_column = 'value';
解析:
-
type:访问类型(性能从优到劣): -
const/eq_ref/ref/range:使用了索引。 -
index:全索引扫描(效率较低)。 -
ALL:全表扫描(未用索引)。 -
key:实际使用的索引名称(若为NULL表示未用索引)。 -
possible_keys:可能用到的索引列表。 -
rows:预估扫描行数(越小越好)。 -
Extra: -
Using index:覆盖索引(仅用索引获取数据,高效)。 -
Using where; Using index:索引被用于过滤数据。 -
Using filesort或Using temporary:需优化(可能未用索引)。
2. EXPLAIN ANALYZE(MySQL 8.0+)
EXPLAIN ANALYZE SELECT * FROM your_table WHERE indexed_column = 'value';
3. SHOW INDEX 检查索引是否存在
SHOW INDEX FROM your_table;
实例:
情况1:使用了索引
EXPLAIN SELECT * FROM users WHERE email = 'user@example.com';
+----+-------------+-------+------+---------------+---------+---------+-------+------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+---------+---------+-------+------+-------+ | 1 | SIMPLE | users | ref | idx_email | idx_email | 768 | const | 1 | NULL | +----+-------------+-------+------+---------------+---------+---------+-------+------+-------+
-
key显示索引名idx_email→ 索引生效。 -
type为ref→ 通过索引查找。
情况2:未使用索引
EXPLAIN SELECT * FROM users WHERE name = 'John'; -- 假设 name 无索引
+----+-------------+-------+------+---------------+------+---------+------+------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+------+---------+------+------+-------------+ | 1 | SIMPLE | users | ALL | NULL | NULL | NULL | NULL | 1000 | Using where | +----+-------------+-------+------+---------------+------+---------+------+------+-------------+
-
key为NULL→ 未用索引。 -
type为ALL→ 全表扫描。

发表评论
所有评论