首页 > 数据库 >Mysql索引为什么选择B+树

Mysql索引为什么选择B+树

时间:2023-07-04 20:56:48浏览次数:40  
标签:为什么 查询 索引 二叉树 IO Mysql 数据 节点

前言

谈到索引,大家并不陌生。索引本身是一种数据结构,存在的目的主要是为了提高数据查询效率,最大程度减少磁盘 IO。那么Mysql InnoDB存储引擎为什么选择B+树,而不是二叉树、B树,Hash等数据结构呢?

使用二叉树会有哪些问题?

了解过二叉树的都知道,一个节点只能有两个子节点,一个子节点只能存储一个数据,数据量大的情况下构建的二叉树高度会很高,在查找比对时次数也随之增多,像MySQL这样使用磁盘存储的数据库来说,就不太适用了,因为每经过一个节点,实际上就需要一次磁盘IO,而我们知道磁盘IO与内存比起来是相当耗时的,如果按照这样的存储方式,可能刚存个几千条数据就查询就已经非常非常慢了。

二叉树

Hash索引会有什么问题?

Hash索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位找到数据,即等值查询效率比较高,不像B树索引需要从根节点逐层遍历IO查找,所以 Hash 索引的查询效率要远高于 B树。 但是即便是这样高效的索引结构也有它的缺陷。

  • 哈希索引数据并不是按照索引值顺序存储的,所以也就无法起到排序作用;
  • 哈希索引也不支持部分索引列匹配查找,因为哈希索引始终是使用索引列的全部内容来计算哈希值的。例如,在数据列(A,B) 上建立哈希索引,如果查询只有数据列A,则无法使用该索引;
  • 哈希索引只支持等值比较查询,不支持任何范围查询;

所以Hash索引只合适一些不需要范围查询的特殊场景。

为什么是B+树而不是B树

 

B树

相比前面的二叉树,B树的优势是一个节点上可以存储多个数据,比如磁盘的一页数据,这样构建的一棵树高度不会太高,从而减少了磁盘的IO次数。下面开始对比B树和B+树,就会发现B+树在查询数据方面要比B树高效的多。

  • B树每个节点都存放索引信息和数据地址,B+树非叶子节点只存放索引信息,叶子节点存放所有的数据,这使得非叶子节点可以存放更多的索引信息,这样构建出来的树高不不会太高,IO次数不会太多;
  • B+树所有的相邻叶子节点数据存在双向指针,范围查找时更加便捷;
  • B+树查询速度更稳定:B+所有数据都存储在叶子节点上,所以每次查找的次数都相同,所以查询速度要比B树更稳定
  • B+树遍历全部节点更快,由于数据全部存放在叶子节点,只需要遍历叶子节点即可,不需要像B树那样,每个节点逐层遍历;

综上所述,Mysql索引数据结构主要采用B+树,B+树其实是B树的升级版,适合组织大量数据,一颗高度为3的B+树,可以存放千万级别的数据表,提高查找效率以及查询时减少磁盘的IO操作。

标签:为什么,查询,索引,二叉树,IO,Mysql,数据,节点
From: https://www.cnblogs.com/fcjedorfjoeij/p/17526960.html

相关文章

  • 图解 MySQL 索引:B-树、B+树,终于搞清楚了
    看了很多关于索引的博客,讲的大同小异。但是始终没有让我明白关于索引的一些概念,如B-Tree索引,Hash索引,唯一索引….或许有很多人和我一样,没搞清楚概念就开始研究B-Tree,B+Tree等结构,导致在面试的时候答非所问!索引是什么?索引是帮助MySQL高效获取数据的数据结构。索引能干什......
  • python索引
    变量名[]正向数时是从零开始,反向是从-1开始切片变量[头下标:尾下标](不包括尾下标所代表的字符)变量名[:]:不指定头下标和尾下标时代表获取整个字符串变量名[1:]:不指定尾下标时代表从指定的头下标到末尾变量名[:5]:不指定头下标时代表从头开始到尾下标指定的字符但不包含尾下标所......
  • MYSQL语句大全——收藏一波
     一、创建和删除数据库1、创建用户//创建用户且设置密码,在MySQL中行,但在Oracle中行----必须在超级管理员身份下操作createuserhncuidentifiedby'1234'2、创建数据库//创建数据库并手动指定编码格式CREATEDATABASEIFNOTEXISTShncuDEFAULTCHARACTERSET'ut......
  • 面试常问集锦——MySQL部分数据库的隔离级别
    聚集索引与非聚集索引的区别https://zhuanlan.zhihu.com/p/113917726Myisam引擎采用非聚集索引,索引与数据分开,叶子结点存放数据的地址。Innodb采用聚集索引,主键索引树的叶子结点存放真实数据,非主键索引树的叶子结点存放主键值索引底层的实现,为什么不选红黑树、B树等?总结(1)哈希表 ......
  • 面试再问MySQL存储过程和触发器就把这篇文章给他
    Mysql存储过程及触发器trigger存储过程一、一个简单的存储过程1,一个简单的存储过程delimiter$$ createproceduretesta() begin Select*fromemp; Select*fromdept; End; $$; delimiter; --调用存储过程 calltesta();存储过程的结构组成:1,创建格式:createpr......
  • 面试再问MySQL存储过程和触发器就把这篇文章给他
    Mysql存储过程及触发器trigger 存储过程一、一个简单的存储过程1,一个简单的存储过程 delimiter$$ createproceduretesta() begin Select*fromemp; Select*fromdept; End; $$; delimiter; --调用存储过程 calltesta();存储过程的结构组成:1,创建......
  • MacBook的mysql无法连接pycharm问题
    问题1:1018-Can'treaddirof'./luffy/'(errno:13-Permissiondenied)这个错误提示表明在Django应用程序中无法读取目录"./luffy/",MySQL数据库连接配置不正确或没有足够的权限访问数据库引起的。而我的连接配置是正确的,所以问题是没有足够的权限1.打开终端,用root用户进......
  • MySQL存储之为什么要使用B+树做为储存结构?
    导言:在使用MySQL数据库的时候,我们知道了它有两种物理存储结构,hash存储和B+树存储,由于hash存储使用的少,而B+树存储使用的范围就多些,如InnoDB和MYISAM引擎都是使用的B+树作为存储结构,B+树,顾名思义,它还是树形结构,那么它是怎么演变过来的,那么就需要从数据结构的角度来分析了一.顺......
  • Windows和Linux下mysql新建用户
    Windows下载xampp,同时启动Apache(设端口为8081)和mysql(3306)。启动cmd,mysql-uroot-p登录root权限,密码默认为空。然后设置root密码setpasswordfor'root'@'localhost'=password('123456');flushprivileges;访问localhost:8081/phpmyadmin,用户名root,输入密码即可进入图形界......
  • mysql数据库语法总结--存储过程、函数、视图、触发器、表
    ​概述抽空总结一下mysql的一些概念性内容,涉及存储过程、函数、视图、触发器等。一、查看存储过程、函数、视图、触发器、表1、存储过程select*frommysql.procwheretype='PROCEDURE';showprocedurestatus;showcreateprocedureproc_name;//存储过程定义​编......