在mysql日常运维和开发里,判断一条慢查询是否命中索引,以及验证新建索引是否真的提升了性能,是两项非常基础也非常重要的工作。下面我们直接看具体的检查与对比方法。

一、mysql怎么检查索引
mysql提供了多种方式来查看表上的索引信息,最常用的是SHOW INDEX语句和查询系统库。
1. 使用SHOW INDEX命令
我们可以直接针对某张表执行如下语句:
-- 查看用户表上的所有索引 SHOW INDEX FROM user FROM test_db; -- 等价写法 SHOW INDEX FROM test_db.user;
结果中Key_name表示索引名,Column_name表示索引列,Non_unique为0代表唯一索引。通过这些信息能快速判断某列是否有索引。
2. 查询information_schema
如果需要批量检查或者写脚本,可以查系统表:
SELECT TABLE_NAME, INDEX_NAME, COLUMN_NAME, NON_UNIQUE FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = 'test_db' AND TABLE_NAME = 'user';
3. 用EXPLAIN看是否命中索引
写查询语句前加EXPLAIN能知道mysql是否使用了索引:
EXPLAIN SELECT * FROM user WHERE phone = '13800000000';
如果输出里key列不为NULL,说明用到了索引;type为ref或range通常比ALL全表扫描好。
二、创建索引前后的性能对比方法
光看索引存在还不够,我们要对比创建索引之前和之后的真实性能差异。
1. 对比EXPLAIN执行计划
建索引前:
EXPLAIN SELECT * FROM user WHERE phone = '13800000000'; -- 假设输出 type=ALL, rows=100000, key=NULL
建立索引:
CREATE INDEX idx_phone ON user(phone);
建索引后再次EXPLAIN:
EXPLAIN SELECT * FROM user WHERE phone = '13800000000'; -- 此时 type=ref, rows=1, key=idx_phone
扫描行数从十万降到一,说明索引生效且性能明显改善。
2. 使用BENCHMARK做简单耗时对比
可以用mysql内置的BENCHMARK()函数重复执行表达式来粗略对比:
-- 建索引前记录时间 SELECT BENCHMARK(100000, (SELECT 1 FROM user WHERE phone = '13800000000')); -- 建索引后同样执行 SELECT BENCHMARK(100000, (SELECT 1 FROM user WHERE phone = '13800000000'));
注意BENCHMARK只计量服务端表达式计算,不完全等同真实查询,但能反映索引查找的快慢趋势。
3. 开启profiling看耗时明细
SET profiling = 1; SELECT * FROM user WHERE phone = '13800000000'; SHOW PROFILES;
通过Query_ID对应的Duration,可以对比创建索引前后同一条语句的耗时。
三、总结建议
检查mysql索引优先用SHOW INDEX和EXPLAIN,性能对比则应结合执行计划的rows变化和实际耗时测量。对于频繁出现在WHERE和JOIN条件里的列,创建索引后通常能看到明显性能提升,但也要注意索引会带来写操作开销,需权衡使用。
mysqlindex_checkperformance_compare修改时间:2026-07-31 09:06:20