持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第26天,点击查看活动详情
前言
上篇我们学习了MySQL中的MyISAM的索引。有兴趣的小伙伴可以阅读(MySQL学习-MyISAM的索引)。
下面我们继续学习MySQL中的Hash结构。
学习Hash结构之前,先总结一下索引的知识,索引是个好东西,但是不能乱建,它在空间和时间上都会有消耗。
索引的代价
- 空间上的代价
- 每建立一个索引都要为它建立一颗B+树,每一颗B+树的每一个节点都是一个数据页,一个页默认会占用16kb的存储空间,一颗很大的B+树由许多数据页组成,就是一片很大的存储空间。
- 时间上的代价
- 每次对表中的数据进行增,删,改操作时,都需要去修改各个B+树索引。而且B+树每层节点都是按照索引列的值从小到大的顺序排列而组成了双向链表。不论是叶子节点中记录,还是内节点中记录都是按照索引列的值从小到大的顺序而形成了一个单向链表。而增,删,改操作可能会对节点和记录的排序造成破坏,所以存储引擎需要额外的时间进行一些记录移位,页面分裂,页面回收等操作来维护好节点和记录的排序。如果我们创建了许多索引,每个索引对应的B+树都要进行相关的操作,会给性能拖后腿。
Hash结构
Hash表也称为散列表,用来快速判断一个元素是否出现在集合里,把需要查询的内容映射为哈希表中的索引,牺牲空间换取时间。
哈希函数有可能将两个不同的关键字映射到相同的位置,这叫作碰撞,在数据库中一般采用链接法来解决。在链接法中,将散列到同一槽位的元素放在一个链表中。
Hash索引适用存储引擎如下:
| 索引 | MyISAM | InnoDB | Memory |
|---|---|---|---|
| Hash索引 | 不支持 | 不支持 | 支持 |
使用自适应Hash索引目的是方便根据SQL的查询条件加速定位到叶子节点,特别是当B+树比较深的时候,通过自适应Hash索引可以明显提高数据的检索效率。
今天先学习到这里,明天继续。