哈希索引

哈希索引是基于哈希表实现的,只有精确匹配索引所有的列的查询才会有效。

对于每行数据,存储引擎都会对所有的索引列计算一个哈希值,哈希值不同键值的行计算出来不同,哈希索引将所有的哈希值存储在索引中,同时在哈希表中保存指向每个数据行的指针。

Mysql中只有Memory引擎显示支持哈希索引。哈希索引是Memory引擎表的默认索引。

如果多个列的哈希值相同,索引会以链表的方式存放多个记录指针到同一个哈希记录中。

哈希索引的缺点

哈希索引只包含哈希值和行指针,而不存储字段值,所以不能使用索引中的值来避免读取行

哈希索引数据并不是按照索引值顺序存储的,所以无法用于排序。

哈希索引也不支持部分索引列的匹配查找,因为哈希索引始终是使用索引列的全部内容来计算哈希值的。

哈希索引只支持等值比较查询,不支持任何范围查询

访问哈希索引的数据非常快,除非有很多哈希冲突。当出现哈希冲突的时候,存储引擎必须遍历链表中所有的行指针,逐行进行比较,直到找到所有符合条件的行。

如果哈希冲突很多的话,维护索引的代价也很高。

InnoDB的自适应哈希索引

当InnoDB注意到某些索引值被使用得非常频繁时,它会在内存中基于B-Tree索引之上在创建一个哈希索引,让B-Tree索引具有哈希索引的优点,比如快速的哈希查找。

其他索引

除了哈希索引 B-Tree索引外,还有其他的索引,比如空间数据索引,全文索引等等。

空间索引会从所有维度进行索引数据。查询时,可以有效的使用任意维度来组合查询

全文索引查找的是文本的关键词,而不是直接比较索引中的值。

号外

另外51blog2022年度评选开始了 希望我的文章的话就给我投票吧

https://blog.51cto.com/blog-contest/index#part2 搜索周杰伦本人或者41 谢谢了❤️