开发者社区 问答 正文

技术运维问题 - MYSQL使用 - RDS MySQL InnoDB 引擎表索引类型更改为 Hash 后无效




1. 问题描述


MySQL 包含的索引类型主要包括 Btree、Hash、FullText 和 Rtree,经常使用的主要是 Btree 和 Hash 两种索引。
通过 DMS 登录 RDS 实例后,执行 DDL 语句可以在 InnoDB 引擎表上创建 Hash 类型的索引,如图:

drop table if exists auth_order; create table auth_order ( id smallint not null comment '主键',member_id varchar( 30) not null comment '会员id', name varchar( 100) not null comment '名称',primary key ( id), key auth_mem_name (member_id) using hash) engine= innodb default charset=utf8 comment= '会员信息';
[/url]

2. 问题原因


由于 MySQL InnoDB 引擎不支持 Hash 索引,而 MySQL 服务层是有 Hash 索引选项的,因此建表语句可以使用子句 Using Hash,而实际创建的索引类型仍然是 Btree 类型的索引。

如果问题还存在,请联系[url=https://selfservice.console.aliyun.com/ticket/createIndex.htm]阿里云售后支持

展开
收起
梨好橙 2018-09-18 00:09:48 2069 分享 版权
阿里云 AI 助理回答

在您的问题中,您尝试通过DMS登录RDS实例,并执行DDL语句以在InnoDB引擎表上创建一个Hash类型的索引。尽管建表语句中使用了USING HASH子句,但实际结果并非预期的Hash索引,而是Btree索引。这是由于MySQL的InnoDB存储引擎实际上并不支持Hash索引。即便在创建语句中指定了USING HASH,InnoDB引擎仍然会默认使用Btree作为索引类型。

因此,当您在InnoDB表上执行类似以下的创建语句时:

CREATE TABLE auth_order (
    id smallint NOT NULL COMMENT '主键',
    member_id varchar(30) NOT NULL COMMENT '会员id',
    name varchar(100) NOT NULL COMMENT '名称',
    PRIMARY KEY (id),
    KEY auth_mem_name (member_id) USING HASH
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='会员信息';

尽管指定了USING HASH,最终生成的auth_mem_name索引依旧会是Btree索引。这是因为InnoDB内部机制不支持Hash索引的实现,即使语法上允许这样的声明。

结论: - InnoDB引擎不支持直接创建Hash索引,建表时指定USING HASH对InnoDB无效,系统将自动使用Btree索引。 - 如果您需要高性能的查找且键值唯一性不是主要考虑因素,可以考虑优化查询逻辑或调整数据结构来提升效率,因为InnoDB的Btree索引已经非常高效,特别是在处理范围查询和排序方面。

如果有关于如何优化查询性能或者关于索引使用的进一步疑问,欢迎继续提问。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答