如何判断索引为USING HASH?MySQL获取完整索引定义方法
嘿,这个问题我之前帮朋友排查过,本质是MySQL 5.6里InnoDB对HASH索引的支持限制导致的,咱们来理清楚:
USING HASH? 首先得明确一个关键事实:MySQL 5.6版本的InnoDB存储引擎完全不支持用户手动创建HASH索引。虽然你在CREATE TABLE语句里明确写了USING HASH,但InnoDB会自动忽略这个选项,默认创建BTREE类型的索引。这就是为什么你通过show indexes或INFORMATION_SCHEMA.STATISTICS查询时,INDEX_TYPE字段始终显示为BTREE的原因。
不过你通过SHOW CREATE TABLE能看到USING HASH的定义,这是因为MySQL会保留你提交的原始DDL语句,但实际执行时并没有按照HASH索引的逻辑去构建。
对于MySQL 5.6的InnoDB表来说,结论很直接:你指定的USING HASH根本没生效,所有用户定义的索引都是BTREE类型。如果要验证,你可以从这两个角度入手:
- 查看
INFORMATION_SCHEMA.STATISTICS的INDEX_TYPE字段:InnoDB如果支持HASH索引的话,这个字段会显示HASH,但5.6版本里不存在这种情况,所有InnoDB索引的INDEX_TYPE都是BTREE。 - 了解InnoDB的自适应哈希索引:这是InnoDB内部自动维护的一种优化结构,不是用户定义的索引,也不会出现在
show indexes或系统表的查询结果里,所以和你手动指定的USING HASH完全不是一回事。
USING HASH的完整索引定义的方法 要拿到包含你原始定义里USING HASH和注释的完整索引信息,有两个可靠的方式:
- 使用
SHOW CREATE TABLE命令:
SHOW CREATE TABLE mydb._fulltexttest;
这个命令会返回你创建表时的完整DDL语句,包括所有索引的USING HASH声明和注释内容。
- 查询
INFORMATION_SCHEMA.TABLES表:
SELECT CREATE_TABLE FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'mydb' AND TABLE_NAME = '_fulltexttest';
这个查询的结果和SHOW CREATE TABLE完全一致,会输出包含所有索引定义的完整表创建语句。
遗憾的是,MySQL本身没有单独的系统表直接存储每个索引的原始USING选项——因为InnoDB并没有实际应用这个选项,所以INFORMATION_SCHEMA.STATISTICS里不会记录它,只能通过完整的表DDL语句来查看你当初的定义。
内容的提问来源于stack exchange,提问作者mpen

