B+树 & mysql

1、数据库中最常见的慢查询优化方式是什么?

    加索引

2、为什么加索引能优化慢查询?

    索引其实是一个数据结构,B+树。

B+树

B+树 & mysql

一个m阶的B+树具有如下几个特征:

    1.有k个子树的中间节点包含有k个元素(B树中是k-1个元素),每个元素不保存数据,只用来索引,所有数据都保存在叶子节点。
    2.所有的叶子结点中包含了全部元素的信息,及指向含这些元素记录的指针,且叶子结点本身依关键字的大小自小而大顺序链接。
    3.所有的中间节点元素都同时存在于子节点,在子节点元素中是最大(或最小)元素。

B+树的优势:

1.单一节点存储更多的元素,使得查询的IO次数更少。
2.所有查询都要查找到叶子节点,查询性能稳定。
3.3.所有叶子节点形成有序链表,便于范围查询。

3、你知道哪些数据结构可以提高查询速度?

    哈希表、完全平衡二叉树、B+树。

4、那这些数据结构既然都能优化查询速度,mysql为何选择用B+树?

    一个节点里面可以存多个元素:磁盘IO
    元素有冗余+叶子节点之间有指针:范围查找
    B+树的优势(见上面)

5、为什么一个节点为1页(16K)就够了?

    假如有个高度为2的B+树:
    result = 叶子节点数 * 一个叶子节点里能存放的数据条数
    叶子节点数 = 根节点的指针数 = {索引值+ 指针}组合数 = 索引值个数
    假设一行数据的大小-=1KB(合理的值)
    一个叶子节点能够存放的数据条数?16KB / 1KB = 16条
    索引值个数?16KB / {int类型索引值8B + 指针6B}  (14B) = 16KB / 14B = 1170
    result = 1170*16=18720
    B+树高度为2 : 1170*16=18720
    B+树高度为3:  1170 * 1170 * 16 = 21902400

6、mysql两种存储引擎下的B+树使用
InnoDB中的B+树:
InnoDB种主键索引的叶子节点的数据区域存储的是数据记录,辅助索引存储的是主键值:
B+树 & mysql
辅助索引:

B+树 & mysql

MyISAM中的B+树:

    MYISAM中叶子节点的数据区域存储的是数据记录的地址。

7、B+树 VS B树:

B+树的非叶子节点不存储数据,只有叶子节点才存储数据;
而B树的非叶子节点和叶子节点都会存储数据,会导致非叶子节点存储的索引值
会更少,树的高度相对会比B+树高,平均的I/O效率会比较低,所以使用B+树作
为索引的数据结构。
再加上B+树的叶子节点之间会有指针相连,也方便进行范围查找。

8、InnoDB总结:

InnoDB中的主键索引和实际数据是绑定在一起的,也就是说InnoDB的一个表一
定要有索引,如果一个表没有手动建立主键索引,InnnoDB会查看有内有唯一索
引,如果有则选用唯一索引作为主键索引,如果连唯一索引也没有,则会默认建
立一个隐藏的主键索引(用户不可见)。
 另外,InnoDB的主键索引要比MyISAM的主键索引查询效率要高(少一次磁盘IO),并且比辅助索引也要高很多。
 所以,我们在使用InnoDB作为存储引擎时,我们最好:

 1、手动创建主键索引
 2、尽量利用主键索引查询

9、到底什么是索引?

    大学老师定义:索引就像是输的目录。
    mysql官网定义:indexes  are used to find rows with specific column values quickly.
    简单理解:索引是一种优化查询的数据结构。

10、 MySQL总结:

    B+树可以更好的结合磁盘IO原理,提高查询效率。
    Innodb一定要有主键,没有主键以唯一索引为主键,否则会建立一个隐藏主键
    Innodb的数据是和主键索引存在一起的(数据在叶子节点中,MyISAM的叶子
    结点数据区域存储的是数据地址)
    建立索引时要考虑已有索引,一个sql语句只会选择花费最低的一个索引执行
    索引是一种有序的数据结构(B+树),一个节点可以存多个有序的元素,所
    以要利用好最左前缀原则。

11、MySQL索引的本质

     索引是一种有序的数据结构

12、mysql索引的底层原理

    B+树实现,具体见上面描述。

    PS:一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以
     索引文件的形式存储的磁盘上。

转载于:https://blog.51cto.com/jiaxiaoxu/2374395

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值