首页 > 数据库 >MySQL(八)哈希索引、AVL树、B树与B+树的比较

MySQL(八)哈希索引、AVL树、B树与B+树的比较

时间:2023-03-17 14:33:20浏览次数:43  
标签:Hash 关键字 查询 AVL 索引 哈希 MySQL 节点

Hash索引

简介

这部分略了

Hash索引效率高,为什么还要设计索引结构为树形结构?
  • Hash索引仅能满足 =、<>和IN查询,如果进行范围查询,哈希的索引会退化成O(n);而树型的有序特性,仍然能够保持O(log2n)的效率
  • Hash索引存储的数据是没有顺序的,如果使用order by语句,还需要对索引重新排序
  • 对于联合索引的情况,哈希需要计算两个索引列合并和哈希值,这样就无法针对单个索引进行查询
  • 对于等值查询,如果索引列的重复度较高,则哈希的效率也会降低,这是由于哈希发生冲突的可能性高,当遇到冲突的时候,需要遍历桶中的行指针来进行比较,找到查询的关键字,非常耗时。比如,列为年龄或者性别的情况就不适合建立哈希索引
Hash索引的适用性
  • 在一些键值数据库都应用较多,如Redis

  • InnoDB和MyISAM都不支持Hash索引,只有Memory存储引擎支持,Memory存储引擎在把某个字段设置为Hash索引的时候,通过Hash计算可以进行缩短。

  • 当键值的重复读较低,并且多为等值查询的时候,Hash索引较为适用

  • InnoDB虽然不支持哈希索引,但是提供了一个自适应哈希索引,是指对于一些字段的等值查询达到一定的条件的时候,会为这个字段添加自适应哈希索引,再次查询的时候就不需要通过树型索引去获取记录,相当于一个查询缓存

    image-20230316160216104

​ 可以通过adaptive_hash_index变量查看是否开启了自适应Hash

mysql> show variables like '%adaptive_hash_index'
    -> ;
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| innodb_adaptive_hash_index | ON    |
+----------------------------+-------+
1 row in set (0.01 sec)

AVL

​ 数据结构就不多介绍了,就是平衡因子为-1 0 1 的二叉搜索树,目的是为了降低平均查找的路径长度

image-20230316160537789

image-20230316160551523

B-Tree

​ B-Tree即多路平衡查找树,进一步降低了平衡二叉树的树高度

  • B树的节点最多有M个子节点,M称作是B树的
  • 每个节点中存放着关键字子节点的指针,关键字升序排列
  • 一个M阶的B树的特性有:
    • 根节点的子节点范围为[2,M]
    • 每个中间节点包含k个子节点和k-1个关键字,k的范围为[ceil(M/2), M]
    • 叶子节点都在同一层

image-20230316160658105

假设想查找关键字9,则依次会查找磁盘块1、2、6最终找到9

小结

  • B树在插入或者删除节点导致的页分裂和合并的不平衡,会通过自动调整节点的位置来保持树的平衡
  • 关键字分布在整棵树中,即叶子节点和非叶子节点中都存放着数据,查找可能在非叶子节点结束
  • 其搜索性能相当于在整个关键字全集中做一次二分查找
image-20230316163530624

B+Tree

​ B+Tree也是一种多路搜索树,基于B+Tree进行了改进,主流的DBMS都支持B+树的索引方式,B+树更适合文件系统

1 和B-Tree的差异
  • 有K个孩子就有K个关键字,即孩子数量等于关键字数量
  • 非叶子节点存放的是孩子节点关键字的最大值
  • 非叶子节点仅仅用于索引,不保存数据记录,所有的数据记录都保存在叶子结点中
  • 所有关键字都保存在叶子节点中,页内的关键字以单链表形式链接,页之间以双向链表方式进行链接
image-20230316164154736
2 B+树的中间节点不存放数据的优点?
  • 查询效率更加稳定:B树有时访问非叶子节点就找到关键字,而有时需要访问到叶子节点才能,而B+树只有访问到叶子节点才能访问到关键字,比较稳定
  • 查询效率更高:B+树比B树更加矮胖(阶数更大,深度更低),这是因为B+树的中间节点不存放数据,因此一个页能够存放更多的关键字
  • 不仅在对单个关键字的查询,在查询范围上,B+树的效率也要比B树高。这是因为B+树的叶子节点的数据通过链表连接,范围查询可以直接通过指针查找,而B树需要通过中序遍历完成范围查找,效率较低。
3 为了减少IO,索引树会一次加载吗
  • 数据库索引是存放在磁盘上的,数据文件很大的时候,索引也会很大,甚至超过几个G
  • 在利用索引进行查询的时候,只是逐一加载每一个磁盘页,因为磁盘页对应索引树的节点
4 B+树的存储能力如何,为什么说一般查找行记录,最多需要1-3次IO

​ InnoDB的页的大小为16kb,一般表的主键为int(4个字节)或者bigInt(8个字节),指针类型也为4-8个字节,也就是说一个页中大概存储16kb/(8B+8B)=1k个键值,则三层索引对应10^9,即1亿条数据

​ 一般情况下每个节点可能不能填满,因此在数据库中B+Tree的高度一般是2-4层,MySQL一般将表的根节点常驻内存,因此一般需要1-3次磁盘IO查找数据

5 为什么说B+树比B-树更适合实际应用中操作系统的文件搜素和数据库索引
  • B+树的磁盘读写代价更低:B+树的节点内部没有实际指向关键字具体信息的指针,因此页容纳的关键字的个数也就更多,一次性读入内存中需要查找的关键字也就更多,相对来说磁盘的IO也就较小
  • B+树的查询效率更加稳定:B树有时访问非叶子节点就找到关键字,而有时需要访问到叶子节点才能,而B+树只有访问到叶子节点才能访问到关键字,比较稳定
6 Hash索引与B+树索引的区别
  • Hash索引不能进行范围查询Hash索引指向的数据是无序的,而B+树索引的叶子节点是个有序的链表
  • Hash索引不支持联合索引的最左侧原则(即联合索引的部分索引无法使用),Hash索引会将索引键联合后一起计算Hash值,所以无法利用部分索引进行查询
  • Hash索引不支持Order by排序,Hash索引指向的数据是无序的;同时也不支持模糊查询
  • InnoDB不支持哈希索引
Hash索引和B+树索引是在建立索引的时候手动指定的吗
  • InnoDB和MyISAM存储引擎会默认采用B+树存储引擎,无法使用哈希索引
  • InnoDB使用自适应哈希不需要手动指定,Memory引擎可以手动指定Hash索引

标签:Hash,关键字,查询,AVL,索引,哈希,MySQL,节点
From: https://www.cnblogs.com/tod4/p/17226706.html

相关文章

  • mysql注入读写文件
    mysql注入读文件mysq|数据库在渗透过程中能够使用的功能还是比较多的,除了读取数据之外,还可以进行对文件进行读写(但前提是权限足够)。下面进行读文件。 load_file()函......
  • mysql 主从配置
    #master修改密码,创建用户,授权用户ALTERUSERUSER()IDENTIFIEDBY'mima';createuser'root'@'%'identifiedWITHmysql_native_passwordby'mima';grantallon*......
  • Splunk DB Connect 连接MySQL报错CLIENT_PLUGIN_AUTH is required
    01、问题描述使用SplunkDBConnect连接MySQL数据库读库时,报错CLIENT_PLUGIN_AUTHisrequired,如下图:02、原因分析根据报错信息,查阅相关资料,了解到报错原因:目标数据库......
  • 力扣197(MySQL)-上升的温度(简单)
    题目:表: Weather编写一个SQL查询,来查找与之前(昨天的)日期相比温度更高的所有日期的 id 。返回结果 不要求顺序 。查询结果格式如下例。 解题思路:方法一:使用......
  • mysql select @params:= 的问题
    1、创建班级表createtableclass(idintprimarykeyauto_increment,titlevarchar(50))2、添加测试数据insertintoclassvalues(null,'小班'),(nul......
  • MySQL错误:Access denied for user 'root'@'%' to database 'xxx'
    本篇记录了我在遇到该问题,解决该问题的全部过程,相信自己,还是很强大的,希望对遇到相似问题的网友有所帮助~本人Linux服务器,Centos7版本,Mysql5.7.14。。。最初问题:使用N......
  • mysql不同版本的功能差异
    概述mysql不同版本的功能差异介绍mysql的官网下载地址http://dev.mysql.com/downloads/MySQLCommunityServer(社区版)社区版本,免费,但是Mysql不提供官方技术支持......
  • 力扣196(MySQL)-删除重复的电子邮箱(简单)
    题目:表: Person编写一个SQL删除语句来删除所有重复的电子邮件,只保留一个id最小的唯一电子邮件。以任意顺序返回结果表。(注意:仅需要写删除语句,将自动对剩余结......
  • MySql生成ER【StarUML】文件
    1.背景要画ER图,一个个打费时费力,StarUML文件打开是json。那么就有可能自动生成。2.效果把表结构生成好,自己只要维护关系即可。3.代码importlombok.Data;import......
  • 【项目实战】基于Python+Django+MySQL的自行车租赁系统(附完整源码)
    1、项目说明基于python+Django+Mysql的自行车租赁系统项目实战项目需要安装pycharm专业版以及MySQL环境(环境搭建和破解可以看我的B站里的视频有讲解)首先需要创建数据......