能,show create table 直接显示所有索引定义(primary key、unique key、key),原样还原建表语句,包含字段顺序、索引名及完整语法,是最准确可靠的方式。

SHOW CREATE TABLE 能直接看到索引定义吗
能,而且是最可靠的方式。SHOW CREATE TABLE 返回的是完整的建表语句,所有索引(包括 PRIMARY KEY、UNIQUE KEY、KEY)都以显式语法写在语句末尾,不需要额外拼接或推断。
常见误区是以为它只展示字段和引擎——其实只要表上有索引,就一定会出现在输出的 Create Table 列里。比如执行:
SHOW CREATE TABLE users;
结果中你会看到类似这样的片段:
PRIMARY KEY (`id`),<br> UNIQUE KEY `users_email_unique` (`email`),<br> KEY `idx_created_at_username` (`created_at`,`username`)
这三行就是索引定义本身,可直接复用为建索引语句(稍作调整即可)。
为什么不用 SHOW INDEX FROM table_name 查看索引创建语句
SHOW INDEX FROM 只返回索引元数据表格,比如列名、是否唯一、索引类型、序列号等,但它不告诉你这个索引当初是用什么 SQL 创建的。
例如联合索引 KEY idx_a_b (a,b) 和 KEY idx_a_b_c (a,b,c) 在 SHOW INDEX 输出里字段顺序、Cardinality 都可能接近,但语义完全不同;而 SHOW CREATE TABLE 会原样写出括号里的字段列表,避免歧义。
容易踩的坑:
-
SHOW INDEX中的Key_name是索引名,不是字段名,别误当成列名去查 - 主键在
SHOW INDEX里显示为PRIMARY,但没写明是否是聚簇索引(InnoDB 下默认是),而SHOW CREATE TABLE结合引擎信息可自然推断 - 如果索引是通过
ALTER TABLE ... ADD PRIMARY KEY后加的,SHOW INDEX不体现创建方式,SHOW CREATE TABLE却保留了最终形态
查看时要不要加 \G 后缀
要,尤其当表结构复杂或索引多时。SHOW CREATE TABLE table_name\G 会把长 SQL 竖排显示,避免字段被截断、换行混乱,方便你一眼定位到索引块。
对比:
-
SHOW CREATE TABLE users;:结果在一列里滚动,容易漏看最后几行索引 -
SHOW CREATE TABLE users\G:每项属性独立成行,KEY和UNIQUE KEY清晰分隔
注意:\G 是 MySQL 客户端命令,不是 SQL 语法,不能在程序里直接执行(比如 PHP 的 mysqli_query 会报错),仅用于终端交互。
information_schema.STATISTICS 能替代 SHOW CREATE TABLE 吗
不能直接替代。虽然 SELECT * FROM information_schema.STATISTICS WHERE TABLE_NAME = 'users' 能查出索引字段、顺序、类型等,但它不包含索引名来源、是否是前缀索引、是否含表达式等关键细节。
比如你看到 SEQ_IN_INDEX = 1 和 COLUMN_NAME = 'title',但不知道这个字段是否用了前缀长度(如 title(100)),也不知道索引名是系统生成还是人工指定——这些都藏在 SHOW CREATE TABLE 的原始语句里。
真正适合用 STATISTICS 的场景是批量分析:比如找出所有长度超过 3 字段的联合索引,或统计某库中重复索引数量。但单表索引还原,还是得靠 SHOW CREATE TABLE。
复杂点在于:有些索引(如全文索引、空间索引)在旧版本 MySQL 中可能不会完整反映在 SHOW CREATE TABLE 输出里,需结合 SHOW INDEX 和引擎文档交叉验证。











