这篇博客将要阐述为什么使用b+树作为索引,而不是b树或者其他树

1.什么是b树

(图片来自网络)

b树相关特性:⑴关键字分布在整棵树中

⑵任何一个关键字只出现在一个节点上

⑶搜索可能在非叶子节点上结束

⑷搜索性能等价于在关键字全集内做二分查找

2.什么是b+树

(图片来自网络)

b+树相关特性:⑴非叶子节点的子树指针与关键字个数相同

⑵b+树只有在到达叶子节点才会命中,其性能也等价于在关键字全集做二分查找

⑶所有关键字都出现在叶子节点的链表中,且链表中关键字恰好有序

⑷不可能在非叶子节点命中

⑸非叶子节点相当于叶子节点的索引,叶子节点相当于数据层

3.为什么使用b/b+树

背景:索引很大,一般都不存放于内存中,而是以文件的形式存放在磁盘中,所以索引的优劣主要看磁盘I/O的存取次数

(磁盘图来自网络)

⑴读取原理:

①磁盘读取时,系统会根据数据逻辑地址传给磁盘,磁盘控制电路会解析出物理地址,即分析出哪个磁道哪个扇区

②为了减小I/O操作,磁盘读取每次都会预读,大小通常为页的整数倍(4k),即使每次是需要读取一个字节,磁盘也会读取一页的数据(4k)放入内存。

(在设计的时,数据库设计者将树的一个节点设计成一页的数据)

⑵为什么使用b+树而非b树:

①对b树而言,如果一次简述需要访问4个节点,数据库设计者把节点大小设计成一页,读取一个节点需要一个I/O操作,那么最多需要3次I/O操作(根节点常存于内存)。综上所述,我们可以得到结论,b-树相对普通树而言,其节点的关键字多,所以其树高也就越低,存取时I/O次数也就越少。

②对b+树而言,b+树优于b树的点就在于其非叶子节点只能存储key,而不存储关键字,这就大大减小了非叶子节点的,每个节点也就能够存放更多记录(其对应的索引),树也就更矮,I/O操作也就越少。

MySQL之索引详解的更多相关文章

  1. MySQL 联合索引详解

    MySQL 联合索引详解   联合索引又叫复合索引.对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c ...

  2. mysql联合索引详解

    联合索引又叫复合索引.对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索 引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c). 可以支持a | a,b ...

  3. mysql覆盖索引详解

    覆盖索引的定义: 如果一个索引包含(或覆盖)所有需要查询的字段的值,称为‘覆盖索引’.即只需扫描索引而无须回表. 只扫描索引而无需回表的优点:    1.索引条目通常远小于数据行大小,只需要读取索引, ...

  4. 【详细解析】MySQL索引详解( 索引概念、6大索引类型、key 和 index 的区别、其他索引方式)

    [详细解析]MySQL索引详解( 索引概念.6大索引类型.key 和 index 的区别.其他索引方式) MySQL索引的概念: 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分 ...

  5. Mysql加锁过程详解(8)-理解innodb的锁(record,gap,Next-Key lock)

    Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...

  6. Mysql加锁过程详解(9)-innodb下的记录锁,间隙锁,next-key锁

    Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...

  7. Mysql加锁过程详解(1)-基本知识

    Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...

  8. Mysql加锁过程详解(3)-关于mysql 幻读理解

    Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...

  9. Mysql加锁过程详解(4)-select for update/lock in share mode 对事务并发性影响

    Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...

随机推荐

  1. 生物结构变异分析软件meerkat 0.189使用笔记(一)

    一.准备工作     meerkat 0.189版本和以前的版本相比,支持bwa mem 输出的bam文件,还支持全外显子数据count SV. meerkat原理:参见http://compbio. ...

  2. MessageFormat.format用法

    用法一: package gacl.request.study; import java.io.IOException; import java.text.MessageFormat; import ...

  3. 【BZOJ2440】完全平方数(二分答案,莫比乌斯反演)

    [BZOJ2440]完全平方数(二分答案,莫比乌斯反演) 题面 BZOJ 题解 很显然,二分一个答案 考虑如何求小于等于这个数的非完全平方数倍数的个数 这个明显可以直接,莫比乌斯反演一下 然后这题就很 ...

  4. P2500 - 【DP合集】背包 bound

    题面 Description N 种物品,第 i 种物品有 s i 个,单个重量为 w i ,单个价值为 v i .现有一个限重为 W 的背包,求能容 纳的物品的最大总价值. Input 输入第一行二 ...

  5. ubuntu 14.04 下实现浏览器接收UDP视频流

    前言 由于近期项目需求,需实现在浏览器上实时预览接收UDP视频流信息.此功能若在VLC上可轻松播放,奈何由于Chrome.Firefox版本的升级,渐渐浏览器不支持外部插件,因而使用VLC web插件 ...

  6. 2D变形transform的translate和rotate

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  7. Android开发——设置界面的创建

    前言: 最近忙着搞项目,难得有时间,便来整理搞项目中学习到的知识 使用之前,先介绍一下android这种的五种数据储存方式,分别为文件储存,SharePrefence,SQL,使用ContentPro ...

  8. 作为一个懒虫,如何优雅的使用windows

    懒虫windows系列(一) 首先是快捷键,因为自己太懒了,觉得用鼠标很麻烦,下面总结一下自己最常用的快捷键(windows10 ) Ctrl+Shift+N:新建文件夹 F2:重命名 Ctrl + ...

  9. 开启第一个Node.js的Express项目

    手动创建一个Express.js的应用可大致分为以下步骤: 1.创建文件夹 a. 创建一个项目根文件夹,如helloWord b.在项目的根目录下创建项目的目录结构,依次创建{public,publi ...

  10. python 全栈开发,Day6

    python之函数进阶 一.引言 现在我有个问题,函数里面的变量,在函数外面能直接引用么? def func1(): m = 1 print(m) print(m) #这行报的错 执行报错: Name ...