Navicat中查看索引列表:右键表→“对象信息”→“索引”选项卡,可直观查看索引名称、类型、字段顺序等;跨库查索引需用SQL——MySQL用INFORMATION_SCHEMA.STATISTICS,PostgreSQL用pg_indexes视图,并注意schemaname和indexdef解析。
在 Navicat 中直接查看索引列表
navicat 提供了图形化方式快速查看表的全部索引,无需写 sql。右键目标表 → 选择「对象信息」→ 切换到「索引」选项卡,就能看到所有已创建的索引名称、类型(primary、unique、index)、字段顺序、是否为前缀索引等关键信息。
注意:不同数据库引擎显示细节略有差异。MySQL 显示 BTREE 或 HASH,PostgreSQL 默认只显示 btree,且不显示索引方法名;SQL Server 可能额外列出包含列(INCLUDE)。
用 SQL 查看索引(跨数据库通用)
图形界面有时不显示索引字段顺序或统计信息,这时必须查系统表。最可靠的是 INFORMATION_SCHEMA.STATISTICS:
SELECT TABLE_NAME, INDEX_NAME, COLUMN_NAME, SEQ_IN_INDEX, NON_UNIQUE FROM INFORMATION_SCHEMA.STATISTICS WHERE TABLE_SCHEMA = 'your_database_name' AND TABLE_NAME = 'your_table_name' ORDER BY INDEX_NAME, SEQ_IN_INDEX;
关键点:
-
SEQ_IN_INDEX表示该字段在复合索引中的位置(1 是最左字段) -
NON_UNIQUE = 0表示是唯一索引(含主键),1是普通索引 - PostgreSQL 不支持
INFORMATION_SCHEMA.STATISTICS,需改用pg_indexes视图
PostgreSQL 用户特别注意 pg_indexes 视图
PostgreSQL 没有标准的 INFORMATION_SCHEMA.STATISTICS,必须用原生视图:
SELECT tablename, indexname, indexdef FROM pg_indexes WHERE schemaname = 'public' AND tablename = 'your_table_name';
indexdef 字段返回完整 CREATE INDEX 语句,能一眼看出是否是 UNIQUE、是否带 USING btree、是否包含表达式索引(如 (lower(name)))。
容易漏掉的坑:
- PostgreSQL 的主键索引默认叫
tablename_pkey,但不会出现在pg_indexes的indexdef里带PRIMARY KEY字样,它只是个普通唯一 B-tree 索引 - 如果表在非
publicschema 下,schemaname必须显式指定,否则查不到
索引存在但没生效?先确认是否被忽略
有时候 SHOW INDEX FROM table_name 或图形界面能看到索引,但 EXPLAIN 显示没走索引。常见原因:
- 查询条件没覆盖索引最左前缀(例如索引是
(a,b,c),但只查WHERE b = 1) - 字段类型隐式转换:
WHERE id = '123'(id是INT)会强制全表扫描 - MySQL 中索引选择性太低(如性别字段建了索引),优化器直接跳过
- PostgreSQL 中
ANALYZE没更新统计信息,导致执行计划不准
真正要验证索引是否起作用,得结合 EXPLAIN ANALYZE 看实际执行路径,不能只依赖“索引存在”这个事实。


















