MySQL中怎么看是否走了索引
学生表
创建普通索引
create index index_name on student (name);
1.使用EXPLAIN查看执行计划(核心)
explain select * from student where name = '李明'
-
key
字段:显示实际使用的索引名称。若值为NULL
,表示未使用索引;若显示具体索引名,说明使用了对应索引。比如EXPLAIN SELECT * FROM student WHERE username = '李明'
,若key
显示index_name
,意味着使用了name
字段上的索引。 -
type
字段:表示查询类型,反映查询性能,效率从高到低排序为system > const > eq_ref > ref > range > index > ALL
。ALL
表示全表扫描,未使用索引;ref
、range
等表示使用了索引,且越靠前性能越好。 -
possible_keys
字段:列出可能使用的索引,与key
字段对比,若possible_keys
有索引但key
为NULL
,说明 MySQL 优化器未选择使用索引。 -
key_len
字段:显示索引使用的字节数,可用于评估索引覆盖的列长度及类型,合理长度有助于判断索引是否正常使用。 -
Extra
字段:包含额外信息,如Using index
表示使用覆盖索引;Using where
表示使用WHERE
条件过滤数据;若出现Using filesort
(文件排序)、Using temporary
(使用临时表) ,说明查询未有效利用索引,性能可能不佳。
2.查看慢查询日志
确认慢查询日志配置
SHOW VARIABLES LIKE 'slow_query_log'; -- 是否开启慢查询日志(ON/OFF)
SHOW VARIABLES LIKE 'slow_query_log_file'; -- 日志文件路径
SHOW VARIABLES LIKE 'long_query_time'; -- 慢查询阈值(秒,默认 10 秒)
临时开启慢查询日志(测试环境)
-- 开启慢查询日志
SET GLOBAL slow_query_log = ON;
-- 设置日志文件路径(需确保路径存在且 MySQL 有写入权限)
SET GLOBAL slow_query_log_file = 'LAPTOP-RK330M4R-slow.log'; -- 确定在的路径
-- 设置慢查询阈值(如 0.1 秒,方便测试)
SET GLOBAL long_query_time = 0.1;
查看日志内容分析
使用命令行工具(如 cat
、less
)或文本编辑器打开日志文件:
less /var/lib/mysql/LAPTOP-RK330M4R-slow.log
3.使用SHOW PROFILE(需要开启功能)
-- 开启profiling功能
SET profiling = 1;
-- 执行查询语句
SELECT * FROM student WHERE name = '李军';
-- 查看查询的执行信息
SHOW PROFILES;
-- 查看指定查询的详细执行信息
SHOW PROFILE FOR QUERY 1; -- 替换为实际的 Query_ID
--g关闭功能
SET profiling = 1;
4、Performance Schema实时监控
SELECT DIGEST_TEXT AS 查询语句,ROWS_EXAMINED AS 扫描行数
FROM performance_schema.events_statements_summary_by_digest
WHERE DIGEST_TEXT LIKE '%student%';
ROWS_EXAMINED
远大于 1 → 可能未走索引,需结合EXPLAIN
确认。
5、索引使用状态
SHOW STATUS LIKE 'Handler_read%';
Handler_read_rnd_next
值高 → 全表扫描多(未走索引)。
总结
explain最快:直接判断结果中的key是否为NULL