我有这样的桌子。
ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;稍后,我创建了像这样的散列索引。
CREATE INDEX index ON table (column) USING HASH;后者,我尝试了一些解释查询。
喜欢
explain Select * from table where column=132;我看到引擎正在possible_keys上使用索引,在关键内容中写着索引的名称!!
但是在文档中说InnoDB现在不允许哈希索引,我想知道为什么我的innoDB应该允许哈希索引?
发布于 2017-07-06 00:36:11
InnoDB悄悄地将“散列”更改为"BTree“。BTree索引可以像散列那样执行,还有更多。或者你觉得有什么好的理由想要哈什?
“很好的理由”-- MySQL是许多年前创建的。它被设计成“瘦削和刻薄”。许多特性归结为“一刀切”:用于索引的BTree;用于JOINing的嵌套循环连接等等。
同时,为了将来的扩展和伪兼容性,还包括了一些常见的语法变体--用于索引的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 in INDEXes (8.0) (很少有用例真正需要这个)注意列表是如何从“必须有”到“好有”排序的。但未来可能包括
HASH索引(和其他类型)UNIQUE和FOREIGN KEY为PARTITIONing。(这并不是分区非常有用。)与此同时,有些事情正在消失(或者已经消失了--无论是在MariaDB还是MySQL)。
发布于 2017-12-19 03:50:14
InnoDB中的特性称为自适应哈希索引,
是否使用散列索引取决于表的规模和查询频率,它是一种完全内部的策略,通常是脱离配置的。
https://dev.mysql.com/doc/refman/5.7/en/innodb-adaptive-hash.html
https://stackoverflow.com/questions/44829140
复制相似问题