能,SHOW CREATE TABLE 直接显示所有索引定义,包括 PRIMARY KEY、UNIQUE KEY 和普通 KEY,以可执行 DDL 形式完整呈现,是查看索引最权威、最完整的方式。

SHOW CREATE TABLE 能直接看到索引定义吗
能,而且是最权威、最完整的索引查看方式之一。SHOW CREATE TABLE table_name 输出的是建表的原始 SQL,所有索引(PRIMARY KEY、UNIQUE KEY、KEY)都以显式语句形式写在末尾,不是抽象描述,也不依赖统计信息刷新状态。
它和 SHOW INDEX FROM table_name 是互补关系:SHOW INDEX 返回结构化元数据(如 Seq_in_index、Sub_part、Null),适合程序解析;而 SHOW CREATE TABLE 返回可复用的 DDL,适合人工确认、迁移或审计。
执行 SHOW CREATE TABLE 后看不懂索引那一行
常见输出中索引部分类似这样:
PRIMARY KEY (`id`), UNIQUE KEY `email` (`email`), KEY `idx_status_created` (`status`,`created_at`)
注意三点:
-
PRIMARY KEY和UNIQUE KEY都是索引,前者还隐含NOT NULL+ 唯一性约束 -
KEY开头的就是普通 B-Tree 索引(InnoDB 默认),名称可省略(MySQL 自动生成如idx_status_created) - 括号里是索引列,逗号分隔表示复合索引;若写成
`email`(10),说明是前缀索引,只取前 10 字符建索引
为什么 SHOW CREATE TABLE 查不到刚加的索引
通常只有两个原因:
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- 索引根本没创建成功——检查是否报错,比如对
TEXT列建索引却没指定前缀长度,会静默失败或报错ERROR 1170 (42000): BLOB/TEXT column 'xxx' used in key specification without a key length - 操作了错误的数据库或表名——
USE db_name是否切换对?表名大小写是否匹配(Linux 下敏感)?
不涉及缓存或延迟:该命令读取的是数据字典的持久化定义,不是内存快照。
想快速定位某个字段有没有被索引,怎么扫
别一行行读,用文本搜索更高效:
- 搜反引号包裹的字段名,比如
`user_id`—— 如果它出现在某条KEY或PRIMARY KEY行的括号里,就说明被索引了 - 搜
UNIQUE KEY或PRIMARY KEY看是否唯一约束,这对业务逻辑(如登录名去重)很关键 - 注意复合索引的顺序:
KEY `idx_a_b` (`a`,`b`)能用于WHERE a = ?,但不能用于WHERE b = ?
真正容易被忽略的是前缀索引和函数索引(MySQL 8.0+)——SHOW CREATE TABLE 会如实显示 `title`(15) 或 (UPPER(name)),但很多人扫一眼就当普通列索引,结果查询时 WHERE title LIKE 'abc%' 没走索引,其实是因为前缀太短或模糊匹配越界。










