主页 > imtokenapp > MySQL btree索引和hash索引的区别

MySQL btree索引和hash索引的区别

imtokenapp 2023-01-18 13:52:40

在 MySQL 中,大多数索引(如 PRIMARY KEY、UNIQUE、INDEX 和 FULLTEXT)都存储在 BTREE 中,但是可以使用内存引擎来选择 BTREE 索引或 HASH 索引。这两种不同类型的索引都有自己的使用范围。.

显然,如果取值差异较大,且以等值查找(=, , in)为主要方法,Hash索引是更高效的选择,其查找复杂度为O(1)@ >。

如果值相对难以区分,并且范围查找占主导地位,那么 B-tree 是更好的选择,它支持范围查找。

一、哈希索引

使用哈希函数计算存储地址,不需要像Btree那样从根节点开始遍历,逐层查找。

Hash索引结构的特殊性,它的检索效率非常高,一次可以定位到索引检索,不像B-Tree索引需要从根节点到分支节点,最后到分支节点进行多次IO访问page 节点,所以 Hash 索引的查询效率远高于 B-Tree 索引。

很多人可能会有疑问。既然Hash索引的效率比B-Tree高很多,那为什么大家不使用Hash索引来代替B-Tree索引呢?一切都有两个方面。哈希索引是一样的。虽然 Hash 索引效率很高,但 Hash 索引本身也因其特殊性带来了很多限制和缺点,主要包括以下几点。

(1)哈希索引只能满足“=”、“IN”和“”查询,不能使用范围查询(慢查询范围)。

由于Hash索引比较的是Hash运算后的Hash值,所以只能用于等值过滤,不能用于基于范围的过滤,因为不能使用对应Hash算法处理的Hash值的大小关系。保证和之前的Hash操作一模一样。

(2)哈希索引不能用来避免数据排序。

由于Hash索引存储的是Hash计算后的Hash值,Hash值的大小关系不一定与Hash运算前的key值完全一致,所以数据库不能使用索引数据来避免任何排序操作;

(3)哈希索引不能用部分索引键查询。

对于复合索引,在计算哈希值时,哈希索引将复合索引键组合起来计算哈希值,而不是单独计算哈希值。因此,通过复合索引的第一个或几个索引键查询时,也不能使用Hash索引。

(4)哈希索引永远不会避免表扫描。

我们已经知道,Hash索引就是对索引键进行Hash运算后,将Hash运算结果的Hash值和对应的行指针信息存储在一个Hash表中。带有Hash键值的数据的记录数不能直接从Hash索引中查询到,但还是需要对比表中的实际数据,得到相应的结果。

(5)Hash索引在遇到大量相等的Hash值后不一定比B-Tree索引有更高的性能。

对于选择性低的索引键usdt哈希值查询网址,如果创建一个Hash索引,就会有大量的记录指针信息与同一个Hash值相关联。这样定位某条记录会很麻烦,会浪费表数据的多次访问,导致整体性能低下。

二、B+ 树

如图,如果要查找数据项29,那么首先将磁盘块1从磁盘加载到内存中。此时发生IO,通过二分查找确定内存中29在17到35之间,磁盘块1被锁定。P2指针,内存时间可以忽略不计,因为它很短(相对于磁盘的IO),通过磁盘块1的P2指针的磁盘地址将磁盘块3从磁盘加载到内存中,第二次IO发生,29在26和30之间,磁盘块3的P2指针被锁定,磁盘块8通过指针加载到内存中,发生第三次IO。真实的情况是,一棵 3 层的 b+ 树可以表示数百万的数据。如果百万数据搜索只需要三个 IO,性能提升将是巨大的。如果没有索引,每个数据项都会有一个IO。,那么一共需要几百万个IO,显然成本非常非常高。

1.索引字段应该尽可能小:

通过上面的分析,我们知道IO的数量取决于b+数的高度h。假设当前数据表中的数据为N,每个磁盘块的数据项数为m,则h=㏒(m+1)@> N,当数据量N不变时,m越大即,h越小;而m=磁盘块的大小/数据项的大小,磁盘块的大小就是一个数据页的大小,是固定的,如果数据占用的空间越小以item为单位,数据项的个数越多,树的高度越低。这就是为什么每个数据项,也就是索引字段,应该越小越好,比如int占用4个字节,比bigint8字节少一半。。这就是为什么b+树需要将真实数据放在叶子节点而不是内部节点中的原因。一旦放入内部节点,磁盘块的数据项将显着下降,导致树增加。当数据项等于 1 时usdt哈希值查询网址,将退化为线性表。

2.索引最左边的匹配特征(即从左到右匹配):

当b+树的数据项为复合数据结构时,如(name,age,sex),b+号按照从左到右的顺序构建搜索树,如when(张三,20,F)当检索到数据时,b+树会首先比较名称来确定下一个搜索方向。如果名字相同,则依次比较年龄和性别,最后得到检索到的数据;但是当没有名字比如(20,F)的数据来的时候,b+树不知道接下来要检查哪个节点,因为名字是构建搜索树时的第一个比较因素,必须要搜索根据名字就知道接下来去哪里查询了。比如检索(张三,F)等数据时,b+树可以用name指定搜索方向,但是缺少下一个字段age,所以只能找到和张三名字相同的数据,然后进行性别匹配。是F的数据。这是一个很重要的性质,即索引最左边的匹配特征。

以上就是MySQL btree索引和hash索引区别的详细内容。更多关于MySQL btree索引和hash索引的信息,请关注其他相关文章!