MySQL的索引系统采用B+树的原因解析

目录
  • 1.什么是索引?
  • 2.为什么需要索引?
  • 3.如何设计索引系统?
  • 4.MYSQL索引系统是什么呢?
  • 5.哈希表
  • 6.树
    • 6.1 二叉树
    • 6.2 二分查找树(Binary Search Tree ,BST)
    • 6.3 平衡二叉树(Balanced Binary Tree, AVL树)
    • 6.4 红黑树
    • 6.5 B树
    • 6.6 B+树
  • 总结

1.什么是索引?

索引是为了加速对表中数据行的检索而创建的一种分散的存储结构。(就好像我们小时候用的字典,有了字典查到对应的字就会变快)

2.为什么需要索引?

首先我们需要了解一些概念和知识

  1. mysql数据存储在什么地方?----磁盘
  2. 查询数据比较慢的,一般情况下是卡在哪了? ----IO
  3. (所以我们要提高IO的效率,那么如何提高呢?---- 次数和量两个层面,例如:搬砖,搬一次和搬十次耗费的力气是不一样的,一次搬一块和一次搬十块耗费的力气(占用IO资源)也是不一样的。所以我们尽可能的在满足自身需求的前提下,减少和IO的交互)
  4. 去磁盘读取数据的时候,是用多少读取多少嘛? ----磁盘预读
  5. 磁盘预读:内存跟磁盘在发生数据交互的时候,一般情况下有一个最小的逻辑单元,称为页,datapage,页一般由操作系统决定是多大,一般是4k和8k,而我们在进行数据交互的时候,可以取页的的整数倍来进行读取,innodb存储引擎每次读取数据为16k
  6. 局部性原理:数据和程序都有聚集成群的倾向,同时之前被访问过的数据和可能再次被查询,涉及空间局部性、时间局部性

通过以上几个概念我们大概知道索引是用来干嘛的了----预先设计好索引系统,等我们查询数据的时候,减少和IO的交互来提高我们的查询效率。

3.如何设计索引系统?

我们还是先明白几个概念

  • 索引存储在哪?---- 磁盘,查询数据的时候会优先将索引加载到内存中
  • 索引在存储的时候需要什么信息?需要存什么字段值?

—— key:实际数据行中储存的值
—— 文件地址(指针、我们需要找到存储数据文件在哪就得靠文件地址)
—— offset:偏移量(如果我们要取文件中的某一条数据时,就需要用到偏移量)

  • 上面说的这种格式的数据要使用什么样的数据结构来储存?

—— 上面可知我们我们的数据格式是 K-V类型的
知道K-V格式数据那我们就知道使用什么数据结构来储存了,有哈希表、树(二叉树二分查找树二分平衡树红黑树B树B+树
综上所述,我们可以上面的数据结构来设计我们的索引系统

4.MYSQL索引系统是什么呢?

为什么不按照上面说的格式储存呢?

众所周知,mysql的索引系统使用的是B+树,为什么是B+树呢?接下来我们逐个分析其他的存储结构为什么不行。在此之前,我们还是需要了解两个前置知识----OLAP和OLTP

当我们存储的数据量越多时,对应建立的索引也会越大,当我们从磁盘读取到内存时就会产生IO问题,那我们又对索引建立索引嘛?不是的,所以mysql采取的B+树

5.哈希表

上面是哈希表的存储结构,我们来探讨这类的存储结构的优缺点
缺点:

  • 哈希冲突会造成数据散列不均匀,会产生大量的线性查询,比较浪费时间
  • 不支持范围查询,当进行范围查询的时候,必须要挨个遍历
  • 对于内存空间的要求比较高(要把全部数据加到到内存中)

优点:
如果是等值查询,那么会非常快

那么在mysql中有没有hash索引呢?

  • memory存储引擎使用的是hash索引
  • innodb支持自适应hash

6.树

6.1 二叉树

二叉树本身是无序的,当我们在进行数据查找时要挨个去跟每个节点进行数据对比,看是否符合我们的数据要求,效率低下

6.2 二分查找树(Binary Search Tree ,BST)

二分查找树的特点:插入数据的时候必须有序,左子树必须小于跟节点,右子树必须保证大于根节点。所以使用二分查找树对比二叉树来显然提高了查询效率。
但是如果数据插入是递增或者递减的顺序的话,二分查找树就会退化成链表,查找效率又降低了

6.3 平衡二叉树(Balanced Binary Tree, AVL树)

根据二叉查找树的所暴露出的问题,我们通过使用AVL树经过左旋或者右旋让树平衡。但是为了保证平衡,在插入数据的时候必须要旋转,通过插入性能的损失来弥补查询性能的提升。读多写少的情况还好,但是如果我读写请求一样多,那就不合适了。

6.4 红黑树

红黑树也是经过左旋和右旋让树平衡起来,还有变色的行为,最长子树只要不超过最短子树的两倍即可…所以就能让查询性能和插入性能近似取得一个平衡,但是随着数据的插入,发现树的深度会变深,深的深度越深,意味着IO次数越多,影响数据读取的效率。

6.5 B树

针对红黑树暴露的问题,那么我们应该如何提高读取的效率呢?我们能不能从有序的二叉树,变成有序的多叉树呢,这样我们就可以储存更多的数据

Degree为4表示的是一个节点存储三个数据值,超过就要变换。那么实际的数据是怎么存储的呢?我们需要Key完整的数据行

上图是B树实际存储数据的图,每个节点有三个元素key指针数据
查找实例,如果我想找28这个数据,先从磁盘块1开始发现读取不到,经对比范围在p2指针指向的磁盘块3,还是没找到,再根据磁盘块3的p2指针指向磁盘块8找到28。我们来分析一下,每个磁盘块大小为16kb,我们查找了三个磁盘块只需读取48kb,那么三层B树能存储多少条记录呢?

我们理想化一下,假设key和指针不占用大小,一条数据占用1k的大小,那么磁盘1数据可以存储16条,磁盘3也是16条,磁盘8也是16条,那么我们只能存储161616=4096条记录,这明显有点少了,而且我们是理想化的,实际key和指针也是占用大小的。

于是乎我们不禁思考,为什么存储的数据量那么少?
我们发现每层存储的大小都被data给占用了,那么我们能不能只存储key跟指针呢?为此就引出了B+树

6.6 B+树

B树到B+树的演变:非叶子节点不存储数据,叶子节点才存储数据

上图我们可以假设p1和28为一组占用10字节大小,那么第一层可以存储16000/10=1600个这样的大小,第二层也是1600,第三层data占用1kb,那就是16条,所以总的存储1600160016=40960000(4096万)条记录

mysql索引结构一般3~4层,但是还要注意一个问题。假设我们就是3层存储结构,如何存储更多的数据?
刚刚我们假设的是p1和28为10字节大小,那如果它们是1字节呢,那么存储总量是160001600010=4096000000。所以就引申出面试一直被提到的建立索引用int还是var好?

答:保证key的长度越小也好,varchar小于4字节用varcahr,大于4字节用int

根据B+树的特点,存储量大,查询快,所以mysql使用的就是B+树

总结

至此mysql索引系统为什么使用的是B+树就讲述完了,如果有什么讲错的地方希望能提醒我改正过来。

到此这篇关于MySQL的索引系统采用B+树的原因解析的文章就介绍到这了,更多相关MySQL索引B+树内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 为什么MySQL数据库索引选择使用B+树?

    在进一步分析为什么MySQL数据库索引选择使用B+树之前,我相信很多小伙伴对数据结构中的树还是有些许模糊的,因此我们由浅入深一步步探讨树的演进过程,在一步步引出B树以及为什么MySQL数据库索引选择使用B+树! 学过数据结构的一般对最基础的树都有所认识,因此我们就从与我们主题更为相近的二叉查找树开始. 一.二叉查找树 (1)二叉树简介: 二叉查找树也称为有序二叉查找树,满足二叉查找树的一般性质,是指一棵空树具有如下性质: 1.任意节点左子树不为空,则左子树的值均小于根节点的值: 2.任意节点右子

  • MySQL用B+树作为索引结构有什么好处

    前言 在MySQL中,无论是Innodb还是MyIsam,都使用了B+树作索引结构(这里不考虑hash等其他索引).本文将从最普通的二叉查找树开始,逐步说明各种树解决的问题以及面临的新问题,从而说明MySQL为什么选择B+树作为索引结构. 一.二叉查找树(BST):不平衡 二叉查找树(BST,Binary Search Tree),也叫二叉排序树,在二叉树的基础上需要满足:任意节点的左子树上所有节点值不大于根节点的值,任意节点的右子树上所有节点值不小于根节点的值.如下是一颗BST: 当需要快速查

  • mysql 使用B+树索引有哪些优势

    搞懂这个问题之前,我们首先来看一下MySQL表的存储结构,再分别对比二叉树.多叉树.B树和B+树的区别就都懂了. MySQL的存储结构 表存储结构 单位:表>段>区>页>行 在数据库中, 不论读一行,还是读多行,都是将这些行所在的页进行加载.也就是说存储空间的基本单位是页. 一个页就是一棵树B+树的节点,数据库I/O操作的最小单位是页,与数据库相关的内容都会存储在页的结构里. B+树索引结构 在一棵B+树中,每个节点为都是一个页,每次新建节点的时候,就会申请一个页空间 同一层的节点

  • MySQL的索引系统采用B+树的原因解析

    目录 1.什么是索引? 2.为什么需要索引? 3.如何设计索引系统? 4.MYSQL索引系统是什么呢? 5.哈希表 6.树 6.1 二叉树 6.2 二分查找树(Binary Search Tree ,BST) 6.3 平衡二叉树(Balanced Binary Tree, AVL树) 6.4 红黑树 6.5 B树 6.6 B+树 总结 1.什么是索引? 索引是为了加速对表中数据行的检索而创建的一种分散的存储结构.(就好像我们小时候用的字典,有了字典查到对应的字就会变快) 2.为什么需要索引? 首

  • 浅析MySQL索引结构采用B+树的问题

    目录 1.B树和B+树 2.原因分析 3.总结 一位6年经验的小伙伴去字节面试的时候被问到这样一个问题,为什么MySQL索引结构要采用B+树?这位小伙伴从来就没有思考过这个问题.只因为现在都这么卷,后面还特意查了很多资料,他也希望听听我的见解. 另外,我花了1个多星期把往期的面试题解析配套文档准备好了,一共有10万字,想获取的小伙伴可以在我的煮叶简介中找到. 1.B树和B+树 一般来说,数据库的存储引擎都是采用B树或者B+树来实现索引的存储.首先来看B树,如图所示. B树是一种多路平衡树,用这种

  • Mysql使用索引的正确方法及索引原理详解

    一 .介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句的优化显然是重中之重.说起加速查询,就不得不提到索引了. 什么是索引? 索引在MySQL中也叫做"键",是存储引擎用于快速找到记录的一种数据结构.索引对于良好的性能 非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要. 索引优化应该是对查询性能优化最有效的手段了.索引能

  • Mysql使用索引实现查询优化

    索引的目的在于提高查询效率,可以类比字典,如果要查"mysql"这个单词,我们肯定需要定位到m字母,然后从下往下找到y字母,再找到剩下的sql.如果没有索引,那么你可能需要把所有单词看一遍才能找到你想要的. 1.索引的优点 假设你拥有三个未索引的表t1.t2和t3,每个表都分别包含数据列i1.i2和i3,并且每个表都包含了1000条数据行,其序号从1到1000.查找某些值匹配的数据行组合的查询可能如下所示: SELECT t1.i1, t2.i2, t3.i3 FROM t1, t2,

  • MySQL中索引失效的常见场景与规避方法

    前言 之前有看过许多类似的文章内容,提到过一些sql语句的使用不当会导致MySQL的索引失效.还有一些MySQL"军规"或者规范写明了某些sql不能这么写,否则索引失效. 绝大部分的内容笔者是认可的,不过部分举例中笔者认为用词太绝对了,并没有说明其中的原由,很多人不知道为什么.所以笔者绝对再整理一遍MySQL中索引失效的常见场景,并分析其中的原由供大家参考. 当然请记住,explain是一个好习惯! MySQL索引失效的常见场景 在验证下面的场景时,请准备足够多的数据量,因为数据量少时

  • Mysql普通索引与唯一索引的选择详析

    假设一个用户管理系统,每个人注册都有一个唯一的手机号,而且业务代码已经保证了不会写入两个重复的手机号.如果用户管理系统需要按照手机号查姓名,就会执行类似这样的 SQL 语句: select name from users where mobile = '15202124529'; 通常会考虑在 mobile 字段上建索引.由于手机号字段相对较大,通常基本不会把手机号当做主键,那么现在就有两个选择: 1.  给 id_card 字段创建唯一索引 2.  创建一个普通索引 如果业务代码已经保证了不会

  • MySQL 普通索引和唯一索引的区别详解

    1 概念区分 普通索引和唯一索引 普通索引可重复,唯一索引和主键一样不能重复. 唯一索引可作为数据的一个合法验证手段,例如学生表的身份证号码字段,我们人为规定该字段不得重复,那么就使用唯一索引.(一般设置学号字段为主键) 主键和唯一索引 主键保证数据库里面的每一行都是唯一的,比如身份证,学号等,在表中要求唯一,不重复.唯一索引的作用跟主键的作用一样. 不同的是,在一张表里面只能有一个主键,主键不能为空,唯一索引可以有多个,唯一索引可以有一条记录为空,即保证跟别人不一样就行. 比如学生表,在学校里

  • MySQL的索引原理以及查询优化详解

    目录 一.介绍 1.什么是索引? 2.为什么要有索引呢? 二.索引的原理 一 索引原理 二 磁盘IO与预读 三.索引的数据结构 四.Mysql索引管理 一.功能 二.MySQL的索引分类 三. 索引的两大类型hash与btree 四.创建/删除索引的语法 五.测试索引 1.准备 2 .在没有索引的前提下测试查询速度 3. 加上索引 六.正确使用索引 一.覆盖索引 二.联合索引 三.索引合并 七.慢查询优化的基本步骤 总结 一.介绍 1.什么是索引? 一般的应用系统,读写比例在10:1左右,而且插

  • MySQL的索引你了解吗

    目录 一.索引介绍 二.索引优缺点 三.索引结构 1.经典B+树 2.MySQL中B+树索引 3.Hash索引 4.为什么InnoDB选择B+树索引? 四.索引分类 五.索引语法 六.SQL性能分析 1.SQL执行频率 2.慢查询日志 3.profile详情 4.explain执行计划 七.索引使用 1.索引效率 2.联合索引 3.索引失效 4.SQL提示 5.覆盖索引 6.前缀索引 7.单列索引与联合索引 八.索引设计原则 总结 一.索引介绍 索引(index)是帮助MySQL高效获取数据的数

随机推荐