Luna's blog 月亮月亮酱

数据库索引原理

2019-07-03

索引原理

MySQL中的数据一般是放在磁盘中的,读取数据的时候肯定会有访问磁盘的操作,磁盘中有两个机械运动的部分,分别是盘片旋转和磁臂移动。盘片旋转就是我们市面上所提到的多少转每分钟,而磁盘移动则是在盘片旋转到指定位置以后,移动磁臂后开始进行数据的读写。那么这就存在一个定位到磁盘中的块的过程,而定位是磁盘的存取中花费时间比较大的一块,毕竟机械运动花费的时候要远远大于电子运动的时间。当大规模数据存储到磁盘中的时候,显然定位是一个非常花费时间的过程,但是我们可以通过B树进行优化,提高磁盘读取时定位的效率。

BTree

B Tree 指的是Balance Tree,也可以写成B-Tree,-只是一个符号。
B树类似于普通的二叉树,但是允许每个节点拥有更多的子节点。
B树的特点:

  1. 所有键值分布在整个树中
  2. 任何关键字出现且只出现在一个节点中
  3. 搜索有可能在非叶子节点结束
  4. 在关键字全集内做一次查找,性能逼近二分查找算法

BTree.png

B+Tree

B+树是B树的一个升级版,相对于B树来说B+树更充分的利用了节点的空间,让查询速度更加稳定,其速度完全接近于二分法查找。为什么说B+树查找的效率要比B树更高、更稳定;我们先看看两者的区别

  1. B+跟B树不同B+树的非叶子节点不保存关键字记录的指针,这样使得B+树每个节点所能保存的关键字大大增加;
  2. B+树叶子节点保存了父节点的所有关键字和关键字记录的指针,每个叶子节点的关键字从小到大链接;
  3. B+树的根节点关键字数量和其子节点个数相等;
  4. B+的非叶子节点只进行数据索引,不会存实际的关键字记录的指针,所有数据地址必须要到叶子节点才能获取到,所以每次数据查询的次数都一样;
    B+Tree.png

    索引的优点

    • 大大减少了服务器需要扫描的数据行数
    • 便于 order by 和 group by等操作
    • 将随机I/O变为顺序I/O

索引的适用条件

  • 非常小的表不适用,直接使用简单全表扫描
  • 特大型的表,建立索引和维护的代价比较大,可采用分区
  • 经常插入、删除、修改的表不适用
  • 数据重复且分布平均的表字段不适用

Content