chi*_*tiz 4 mysql indexing hash
我有一张这样的桌子。
ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;
Run Code Online (Sandbox Code Playgroud)
后来我创建了一个像这样的哈希索引。
CREATE INDEX index ON table (column) USING HASH;
Run Code Online (Sandbox Code Playgroud)
后来我尝试了一些解释查询。
喜欢
explain Select * from table where column=132;
Run Code Online (Sandbox Code Playgroud)
我看到引擎正在使用 possible_keys 上的索引,并且在关键内容中显示了索引的名称!
但在文档中说 InnoDB 不允许哈希索引现在我想知道为什么我的 innoDB 据说允许哈希索引?
InnoDB默默地将“HASH”更改为“BTree”。BTree 索引的作用与 HASH 的作用相同,甚至更多。或者你认为有什么充分的理由需要哈希?
“充分的理由”——MySQL 是在很多年前创建的。它被设计为“精简而简朴”。许多功能都归结为“一刀切”:BTree 用于索引;嵌套循环连接 forJOINing
等
同时,为了未来的扩展和伪兼容性,包括了一些常见的语法变体——HASH
用于索引、DESC
索引排序等。即使这些“谎言”会发生什么,数据库引擎仍然会给你“正确”的答案。
随着时间的推移,最明显的捷径已经得到纠正。
LOCK TABLES
,但这还不够。)information_schema
(4.1?)(相对于各种SHOW
命令)注:8.0用“数据字典”对其进行了彻底修改)TEMPORARY TABLEs
不够)JOIN
优化(5.6、5,7、8.0)only_full_group_by
(MariaDB 10.1?,5.7)ALTER
不“总是”复制表格(主要是 5.7)FULLTEXT
和SPATIAL
InnoDB 中的索引(5.7、8.0)(因此 MyISAM 可以被弃用)DESC
在INDEXes
(8.0)中(很少有用例真正需要这个)请注意该列表是如何从“必须有”到“最好有”排序的。未来可能包括
HASH
索引(和其他类型)(MariaDB 10.4,仅适用于UNIQUE
on TEXT/BLOB
)UNIQUE
并FOREIGN KEY
为PARTITIONing
. (并不是说分区非常有用。)与此同时,有些东西正在消失(或者已经消失——无论是在 MariaDB 还是 MySQL 中)
小智 5
InnoDB中的特性称为自适应哈希索引,
是否使用哈希索引取决于表的规模和查询频率,这完全是内部策略,通常无需配置。
https://dev.mysql.com/doc/refman/5.7/en/innodb-adaptive-hash.html