上一篇
场景引入:
凌晨三点,你正盯着屏幕排查一个慢查询问题。"明明加了索引,为什么还是卡?"你揉着发酸的眼睛嘀咕,这时突然意识到——会不会有其他隐藏的索引影响了性能?别急,今天我们就来解锁这个必备技能:如何彻底摸清数据库里的所有"藏宝图"(索引)。
方法1:SHOW INDEX 直通车
-- 查看单表索引(最常用) SHOW INDEX FROM 用户表; -- 配合表名模糊查询(5.7+版本) SELECT * FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = '你的数据库名' AND TABLE_NAME LIKE '%订单%';
输出示例:
Table | Non_unique | Key_name | Seq_in_index | Column_name
--------|------------|------------|--------------|------------
用户表 | 0 | PRIMARY | 1 | user_id
用户表 | 1 | idx_mobile | 1 | phone
小贴士:Non_unique=0
代表唯一索引,Seq_in_index
显示联合索引中的字段顺序。
方法2:information_schema 高级侦查
-- 查整个数据库的索引清单 SELECT TABLE_NAME, INDEX_NAME, GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) AS 索引字段 FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = '电商系统' GROUP BY TABLE_NAME, INDEX_NAME;
适用场景:需要导出整个库的索引清单给同事时,这个查询结果可以直接贴进Excel。
招式1:USER_INDEXES + USER_IND_COLUMNS 组合拳
-- 查看当前用户所有索引 SELECT i.INDEX_NAME, i.TABLE_NAME, i.UNIQUENESS, LISTAGG(c.COLUMN_NAME, ',') WITHIN GROUP (ORDER BY c.COLUMN_POSITION) AS 字段列表 FROM USER_INDEXES i JOIN USER_IND_COLUMNS c ON i.INDEX_NAME = c.INDEX_NAME GROUP BY i.INDEX_NAME, i.TABLE_NAME, i.UNIQUENESS;
重点字段说明:
UNIQUENESS
:显示UNIQUE/NONUNIQUE COLUMN_POSITION
:联合索引中的字段顺序 招式2:DBA视角全局扫描(需DBA权限)
-- 查全库所有索引(含系统表) SELECT OWNER, TABLE_NAME, INDEX_NAME FROM DBA_INDEXES WHERE OWNER NOT IN ('SYS','SYSTEM');
利器1:sp_helpindex 快捷命令
-- 查看某表索引 EXEC sp_helpindex 'dbo.订单表';
典型输出:
index_name | index_description | index_keys
-------------|----------------------------|-----------
PK_订单 | clustered, unique, primary | 订单ID
IX_客户ID | nonclustered | 客户ID,创建时间
利器2:sys.indexes 深度分析
-- 查所有索引的存储细节 SELECT OBJECT_NAME(i.object_id) AS 表名, i.name AS 索引名, i.type_desc AS 索引类型, COL_NAME(ic.object_id,ic.column_id) AS 字段名 FROM sys.indexes i JOIN sys.index_columns ic ON i.object_id = ic.object_id AND i.index_id = ic.index_id WHERE i.object_id = OBJECT_ID('dbo.库存表');
专业提示:type_desc
会显示CLUSTERED/NONCLUSTERED等关键信息。
隐藏的索引杀手
VISIBLE=NO
) -- 特别检查不可见索引 SELECT * FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = '你的库名' AND IS_VISIBLE = 'NO';
索引重复检测
-- 检测相同字段组合的重复索引(MySQL示例) SELECT GROUP_CONCAT(TABLE_NAME) AS 涉及表, GROUP_CONCAT(INDEX_NAME) AS 重复索引, COLUMN_NAMES FROM ( SELECT TABLE_SCHEMA, GROUP_CONCAT(COLUMN_NAME ORDER BY SEQ_IN_INDEX) AS COLUMN_NAMES, COUNT(*) AS cnt FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = '你的库名' GROUP BY TABLE_SCHEMA, TABLE_NAME, GROUP_CONCAT(COLUMN_NAME) WHERE cnt > 1;
索引使用率检查(以MySQL为例)
-- 需开启performance_schema SELECT * FROM sys.schema_unused_indexes WHERE object_schema = '你的库名';
最后的小测验:
当你发现某张表有5个索引但查询仍然很慢时,最可能的原因是?(多选)
□ A. 存在大量重复索引
□ B. 索引字段顺序与查询条件不匹配
□ C. 索引统计信息过期
□ D. 该表数据量太小不需要索引
(答案:通常选ABC,D在数据量极小时可能成立)
掌握这些方法后,下次再遇到索引问题,你就能像老侦探一样快速摸清数据库的"索引家底"啦!
本文由 覃嘉云 于2025-08-07发表在【云服务器提供商】,文中图片由(覃嘉云)上传,本平台仅提供信息存储服务;作者观点、意见不代表本站立场,如有侵权,请联系我们删除;若有图片侵权,请您准备原始证明材料和公证书后联系我方删除!
本文链接:https://vps.7tqx.com/wenda/559959.html
发表评论