Mysql 索引方法 BTree 和 Hash


Mysql 索引方法 BTree 和 Hash

BTree 和 Hash 在 MySQL 里是什么

在 MySQL 里的 BTree 和 Hash 指的是数据在存储时所使用的数据结构。

主流的关系型数据库都是使用BTree作为表默认的索引数据结构

什么是BTree

BTree 也就是平衡树;

BTree有以下特点:

  1. 所有非叶子节点只存储键值信息。
  2. 所有叶子节点之间有一个链指针
  3. 数据记录都在叶子节点中

Image Text

通常在 BTree 上有两种头指针,一个指向根节点,一个指向关键字最小的叶子节点,而且所有叶子节点之间通过链指针连接起来形成一个链式环结构。

因此可以对BTree进行两种查询:

  1. 对于主键范围查找
  2. 从根节点开始进行查找

参考资料:BTree和B+Tree详解

什么是Hash

哈希表,是根据关键码值(Key Value)而直接进行访问的数据结构。 也就是说他通过把关键码值映射到一个位置来访问记录,以加快查找速度。这个映射函数叫做散列函数,这个映射表也叫做散列表。

那么Hash索引就是采用一定的哈希算法,把键值转换成新的哈希值,检索时不需要类似BTree那样从根节点到叶子节点逐级查找,只需要一次哈希算法即可定位到相应的位置,速度非常快

怎么通过hash去查找呢

理想情况下使用Hash函数将被查找的键转为数组的索引。最后根据数组的索引直接取到数据的内存地址。

Image Text

参考资料:哈希表、哈希索引详解

BTree和Hash的区别是什么呢

  • 如果是等值查询,那么Hash索引有着明显的优势,在键值唯一的情况下,Hash索引只需要一次算法就能找到对应的值,而BTree需要从根节点逐级往叶子节点搜索。
  • 如果是范围查询的话,BTree就有明显优势,就算是有序的键值通过Hash后都可能变成不连续的,因此Hash索引在范围查询上毫无优势。
  • Hash无法完成排序以及like “xx%”这样的模糊查询(这个其实也是范围查询)
  • Hash索引不支持符合索引的最左匹配原则
  • 在有大量键值重复的情况,Hash索引的效率也是非常低的

MySQL各表引擎支持哪些索引呢

  • MyISAM:BTree
  • InnoDB:BTree
  • Memory/Heap:Hash,BTree

参考资料:mysql 存储引擎对索引的支持


文章作者: 我若为侠
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 我若为侠 !
 上一篇
Mysql 多列字段索引 最左匹配原则理解 Mysql 多列字段索引 最左匹配原则理解
Mysql 多列字段索引 最左匹配原则理解背景在理解Mysql 索引的时候,有看到一篇关于 最左匹配原则的博客,感觉写的挺有意思的,因此做下记录 多列字段索引他数据结构是什么样的?索引的底层数据就是一颗BTree,那么联合索引(多列字段索引
下一篇 
MySQL BTree深入了解 MySQL BTree深入了解
Mysql BTree深入了解背景在了解完数据库的BTree后,在看某篇博客的时候被里面的几个问题吸引了,博客里也有问题的解答,感觉挺有意思的,因此做下记录以及自己个人的理解 参考资料:数据库索引类型及其原理 数据表为什么会使用主键?事实上
  目录