Mysql Hash索引和B-Tree索引区别(Comparison of B-Tree and Hash Indexes)

  上篇文章中说道,Mysql中的Btree索引Hash索引区别,没做展开描述,今天有空,上Mysql官方文档找到了相关答案,看完之后,针对两者的区别做如下总结:

  引用维基百科上的描述,来解释一下这两种数据结构,这些知识在《数据结构与算法》这门课程中也有讲述:

  在计算机科学中,B树英语:B-tree)是一种自平衡的树,能够保持数据有序。这种数据结构能够让查找数据、顺序访问、插入数据及删除的动作,都在对数时间内完成。B树,概括来说是一个一般化的二叉查找树(binary search tree)一个节点可以拥有最少2个子节点。与自平衡二叉查找树不同,B树适用于读写相对大的数据块的存储系统,例如磁盘。B树减少定位记录时所经历的中间过程,从而加快存取速度。B树这种数据结构可以用来描述外部存储。这种数据结构常被应用在数据库和文件系统的实现上。

  什么是HASH数据结构:

  散列表Hash table,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表

一个通俗的例子是,为了查找电话簿中某人的号码,可以创建一个按照人名首字母顺序排列的表(即建立人名{\displaystyle x}

x

到首字母{\displaystyle F(x)}

F(x)

的一个函数关系),在首字母为W的表中查找“王”姓的电话号码,显然比直接查找就要快得多。这里使用人名作为关键字,“取首字母”是这个例子中散列函数的函数法则{\displaystyle F()}

F()

,存放首字母的表对应散列表。关键字和函数法则理论上可以任意确定。

  总言之:

HASH这种数据结构,数据是无序的,是key-value型,被用于精确匹配非常高效。所以在mysql中使用这种索引类型,将不支持模糊匹配,比如like ‘aaa%’。

B-Tree这种数据结构数据是有序的,在Mysql中默认的索引类型是 B-Tree。B-Tree这种索引类型,决定了mysql能够基于这种类型做数据区间匹配,可以实现=, >, >=, <, <=, or BETWEEN 这些语法。且支持模糊搜索,但是不支持 类似 like '%xxx%'这种前后模糊匹配的语句,仅支持后半段模糊匹配。

其中,mysql并不是有索引就一定会使用,查询优化阶段会判断扫描行进行预估,可能表扫描更快,这个时候就不走索引,解决方法就是加上limit。

  以下是mysql的官方文档说明,简单明了,还配有两个案例,原文链接:https://dev.mysql.com/doc/refman/5.7/en/index-btree-hash.html

8.3.8 Comparison of B-Tree and Hash Indexes

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyyjxp.html