这篇博客将要阐述为什么使用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. java.lang.ArrayIndexOutOfBoundsException

    1.错误描述 Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 at com.you.m ...

  2. CentOS中对ext4文件系统做磁盘配额

    1.修改/etc/fstab文件,使ext4文件系统支持磁盘配额. UUID="9e6dc1e8-4fc1-4984-be38-524573572d41" /mnt/ext ext ...

  3. 教我徒弟Android开发入门(三)

    前言: 老实说,我有点不知道该讲什么了,希望看过的人能给我提提意见,感激不尽. 本期知识点: 长按事件,log的简单使用,双击退出程序功能的实现 正文: 上一期我们了解到点击事件其实就是让控件绑定一个 ...

  4. 纯CSS实现二级导航下拉菜单--css的简单应用

    思想:使用css的display属性控制二级下拉菜单的显示与否.当鼠标移动到一级导航菜单的li标签时,显示二级导航菜单的ul标签.由于实现起来比较简单,所以在这里直接给出了参考代码. 1.纯CSS二级 ...

  5. Autofac高级用法之动态代理

    前言 Autofac的DynamicProxy来自老牌的Castle项目.DynamicProxy(以下称为动态代理)起作用主要是为我们的类生成一个代理类,这个代理类可以在我们调用原本类的方法之前,调 ...

  6. Mac上使用虚拟机搭建Hadoop集群

    一. mini安装一台centos到虚拟机上 安装过程参考这篇博客http://www.linuxdown.net/install/setup/2015/0906/4053.html 二. 修改网络配 ...

  7. 凸包--Graham扫描法

    一直听大佬们说:凸包.凸包.凸包 一直不会..... 然后.... 今天考试,考了一道计算几何的简单题.... 这,,,还是学一下吧.. 然后考试现场学习一下凸包算法. 先理解一下凸包是啥东西. 看看 ...

  8. 【BZOJ1968】约数研究(数论)

    [BZOJ1968]约数研究(数论) 题面 BZOJ链接(题目是图片形式的) 题解 傻逼题 \(NOIP\) \(T1\)难度 不会做的话您可以退役 #include<iostream> ...

  9. setTimeout模拟interval

    /** * @param fn: {Function} // function which to execute * @param timer: {number} // gap time betwee ...

  10. 应用canvas绘制动态时钟--每秒自动动态更新时间

    使用canvas绘制时钟 下文是部分代码,完整代码参照:https://github.com/lemoncool/canvas-clock,可直接下载. 首先看一下效果图:每隔一秒会动态更新时间 一. ...