当前位置:网站首页>MYSQL索引钟B-TREE ,B+TREE ,HASH索引之间的区别和应用场景
MYSQL索引钟B-TREE ,B+TREE ,HASH索引之间的区别和应用场景
2022-07-06 09:19:00 【几何学家】
先前提到过,一个好的索引能够加速mysql的检索速度,但其实索引也有不同的类型,就比如不同的工具在不同的应用场景下也能发挥一个合适的效果
mysql目前的索引主要有B-TREE ,B+TREE ,HASH
1.HASH索引
哈希索引的key,value的格式很适合作为索引,对于每一行数据,存储引擎都会计算出一个hashcode,,哈希索引将所有的hashcode存储在索引中,同时保存每行数据的指针
哈希索引的缺点:
1.哈希索引只包含哈希值和行指针,不存储字段值,因此不能使用索引中的值来读取行,要采用hashcode
2.hash索引适合比较等值查询,对于一些范围查询由于并不是按照索引值顺序存储的,因此也就不适合排序
3.大量hash冲突的话,维护操作的代价会很高
2.B-Tree索引
B树是一种平衡的多路查找树,我们把树中结点最大的子树数目称为B树的阶。通常记为m。
B树的查找操作:
B树的查找其实和二叉排序树非常相似,可以理解为m叉排序树
① 先让待查找关键字key和结点中的关键字比较,如果等于某个关键字,则查找成功。
② 如果和所有的关键字都不相等,则看key处在哪个范围内,然后去对应的指针所指向的子树中查找。
例: 如果Key比第一个关键字K1还小,则去P0指针所指向的子树中查找,如果比最后一个关键字KN还大,则去PN指针所指向的子树中查找。
第一步:和跟节点10比较,不等且比10大,去右边的子树中查找;
第二步: 和右子树中关键字14比较,不等且比14小,故去左子树中查找;
第三步:和左子树中关键字11比较,相等,获取其data,返回。
B树的插入删除等操作不详细介绍,有需要可以看这篇帖子https://www.cnblogs.com/xiaofengshan/p/15443140.html
优点:
B树可以在内部节点同时存储键和值,因此,把频繁访问的数据放在靠近根节点的地方将会大大提高热点数据的查询效率。这种特性使得B树在特定数据重复多次查询的场景中更加高效。
3.B+树索引
B+树是B-树的变体,也是一颗多路搜索树。一棵m阶的B+树主要有这些特点:
每个结点至多有m个子女;
非根节点关键值个数范围:⌈m/2⌉ - 1 <= k <= m-1
相邻叶子节点是通过指针连起来的,并且是关键字大小排序的。
优点:
当需要进行一次全数据遍历的时候,B+树只需要使用O(logN)时间找到最小的一个节点,然后通过链进行O(N)的顺序遍历即可。而B树则需要对树的每一层进行遍历,这会需要更多的内存置换次数,因此也就需要花费更多的时间
B+树和B-树的主要区别如下:
B-树内部节点是保存数据的;而B+树内部节点是不保存数据的,只作索引作用,它的叶子节点才保存数据。
B+树相邻的叶子节点之间是通过链表指针连起来的,B-树却不是。
查找过程中,B-树在找到具体的数值以后就结束,而B+树则需要通过索引找到叶子结点中的数据才结束
B-树中任何一个关键字出现且只出现在一个结点中,而B+树可以出现多次。
边栏推荐
- [algorithm] sword finger offer2 golang interview question 8: the shortest subarray with a sum greater than or equal to K
- Agile development helps me
- [rtklib 2.4.3 B34] version update introduction I
- [算法] 剑指offer2 golang 面试题4:只出现一次的数字
- [GNSS data processing] Helmert variance component estimation analysis and code implementation
- 微信小程序开发心得
- 地球围绕太阳转
- Fairygui loop list
- [algorithm] sword finger offer2 golang interview question 6: sum of two numbers in the sorting array
- KF UD decomposition pseudo code implementation advanced [2]
猜你喜欢
[algorithm] sword finger offer2 golang interview question 13: sum of numbers of two-dimensional submatrix
2022国赛Re1 baby_tree
[算法] 剑指offer2 golang 面试题6:排序数组中的两个数字之和
RTKLIB: demo5 b34f. 1 vs b33
Implementation of Excel import and export functions
121 distributed interview questions and answers
Fgui project packaging and Publishing & importing unity & the way to display the UI
Matlab读取GNSS 观测值o文件代码示例
FairyGUI条子家族(滚动条,滑动条,进度条)
【干货】提升RTK模糊度固定率的建议之周跳探测
随机推荐
Ten minutes to thoroughly master cache breakdown, cache penetration, cache avalanche
Database table splitting strategy
FairyGUI簡單背包的制作
[算法] 劍指offer2 golang 面試題2:二進制加法
isEmpty 和 isBlank 的用法区别
Lean product development - Lean Software Development & lean product development
【rtklib】在rtk下使用抗差自适应卡尔曼滤波初步实践
KF UD分解之伪代码实现进阶篇【2】
记录:Navicat Premium初次无法连接数据库MySQL之解决
GPS高程拟合抗差中误差的求取代码实现
基于rtklib源码进行片上移植的思路分享
Agile development helps me
Record: I accidentally wrote a recursion next time
Basic DOS commands
Meanings and differences of PV, UV, IP, VV, CV
《软件测试》习题答案:第一章
[算法] 剑指offer2 golang 面试题4:只出现一次的数字
Affichage du changement de valeur du Buff de gain de l'interface graphique de défaillance
[GNSS] robust estimation (robust estimation) principle and program implementation
WSL common commands