当前位置:首页 > 问答 > 正文

数据库管理|索引查询:快速掌握如何查看数据库中所有的索引,全面了解查看数据库所有索引的方法

手把手教你快速查看所有索引

场景引入
凌晨三点,你正盯着屏幕排查一个慢查询问题。"明明加了索引,为什么还是卡?"你揉着发酸的眼睛嘀咕,这时突然意识到——会不会有其他隐藏的索引影响了性能?别急,今天我们就来解锁这个必备技能:如何彻底摸清数据库里的所有"藏宝图"(索引)。


MySQL篇:索引全览指南

方法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。

数据库管理|索引查询:快速掌握如何查看数据库中所有的索引,全面了解查看数据库所有索引的方法


Oracle篇:索引探查术

招式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');

SQL Server篇:索引全景扫描

利器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等关键信息。


实战避坑指南

  1. 隐藏的索引杀手

    • MySQL 8.0的不可见索引(VISIBLE=NO
      -- 特别检查不可见索引
      SELECT * FROM information_schema.STATISTICS 
      WHERE TABLE_SCHEMA = '你的库名' 
      AND IS_VISIBLE = 'NO';
  2. 索引重复检测

    -- 检测相同字段组合的重复索引(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;
  3. 索引使用率检查(以MySQL为例)

    数据库管理|索引查询:快速掌握如何查看数据库中所有的索引,全面了解查看数据库所有索引的方法

    -- 需开启performance_schema
    SELECT * FROM sys.schema_unused_indexes
    WHERE object_schema = '你的库名';

最后的小测验
当你发现某张表有5个索引但查询仍然很慢时,最可能的原因是?(多选)
□ A. 存在大量重复索引
□ B. 索引字段顺序与查询条件不匹配
□ C. 索引统计信息过期
□ D. 该表数据量太小不需要索引

(答案:通常选ABC,D在数据量极小时可能成立)

掌握这些方法后,下次再遇到索引问题,你就能像老侦探一样快速摸清数据库的"索引家底"啦!

发表评论