sql server缺失索引需联查三个dmv:sys.dm_db_missing_index_details(定位列和条件)、sys.dm_db_missing_index_groups(关联分组)、sys.dm_db_missing_index_group_stats(评估收益),单独查任一视图信息不完整。
直接查 sql server 缺失索引的三个核心视图
sql server 不会主动报警“你缺索引了”,但它每执行一条查询,都会悄悄记下:“要是这里有个索引,能快 avg_user_impact%”。这些线索全藏在三个动态管理视图(dmv)里,必须联查才有意义:
-
sys.dm_db_missing_index_details:告诉你“缺在哪张表、哪几列、等值还是范围条件、要不要 INCLUDE” -
sys.dm_db_missing_index_group_stats:告诉你“这个缺失索引如果建了,预计能省多少成本,被多少次查询用到” -
sys.dm_db_missing_index_groups:把上面两个视图串起来——没有它,你根本不知道哪组建议对应哪条记录
单独查任何一个,信息都是碎片。比如只看 sys.dm_db_missing_index_details,你会看到一堆 equality_columns,但完全不知道这条建议到底值不值得建——可能它只被跑过 1 次,user_seeks = 1,再高 avg_user_impact 也没意义。
用推荐公式过滤出真正该建的索引
官方推荐的排序逻辑不是拍脑袋来的:avg_total_user_cost * avg_user_impact * (user_seeks + user_scans)。这个乘积本质是“总收益预估”,它自动把高频、高成本、高提升潜力的建议顶到前面。
- 别直接抄
TOP 10结果建索引——有些推荐的improvement_measure很高,但user_seeks是 0,全是user_scans,说明是低效全表扫描场景,建索引未必治本 - 注意
database_id和object_id:结果里混着多个库、多张表的建议,务必用DB_NAME(database_id)和OBJECT_NAME(object_id, database_id)解析出真实表名,否则容易建错库 -
inequality_columns后面跟LIKE '%xxx'的列,建索引效果极差,这类建议可直接忽略(B-Tree 索引对前导通配符无效)
MySQL 里没有“缺失索引”视图,得换思路验证
MySQL 没有类似 SQL Server 的 DMV,不能“预测缺失”,只能“反查没用上的索引”。关键不是找“该建什么”,而是确认“现有查询有没有走索引”:
- 对慢查询加
EXPLAIN,重点看type字段:如果是ALL或index,基本等于没走有效索引 -
SHOW INDEX FROM table_name只显示“有哪些索引”,不反映使用情况;而INFORMATION_SCHEMA.STATISTICS虽结构化,但同样不带访问统计 - 想长期监控,得开
performance_schema并查events_statements_summary_by_digest,结合rows_examined和rows_sent比值判断扫描效率——比值远大于 1,大概率缺索引
别忘了重启后数据清零这个硬限制
SQL Server 的缺失索引数据从服务启动时开始累计,sys.dm_db_missing_index_details 里所有记录在每次重启后全部消失。这不是 bug,是设计:
- 如果你只在周五下午查一次,发现一堆高分建议,周一就重启了——全没了,白忙
- 生产环境建议搭配 SQL Agent 定期(比如每天凌晨)把关键字段(
database_id,object_id,equality_columns,improvement_measure)存进自定义表,持续观察趋势 - 阿里云 DAS、腾讯云 DBbrain 这类平台的“缺失索引”功能,底层就是帮你做了这件事:定时采集 + 去重合并 + 归因到具体慢 SQL,别以为它是魔法,它只是替你写了那个采集作业
真正容易被忽略的,不是“怎么查”,而是“查出来的数据能信多久”——SQL Server 给你的是一张快照,不是病历本。










