MySQL B-Tree索引

133 阅读2分钟

这是我参与8月更文挑战的第30天,活动详情查看:8月更文挑战

猫和老鼠.jpg

前言:   本篇文章 是我关于MySQL的第30篇文章,水平一般、能力有限。文章写的比较浅,适合新手来看。

书本有章节目录,游乐场有指南,商场有平面图。这些东西可以让我们的寻找目标时更加便捷快速。

MySQL的索引也是这个目的,通过构建索引来让对数据的检索更加高效。MySQL的索引类似与存储引擎一样有多种。下面来一一介绍。

B-Tree

首先来介绍一下B-Tree数据结构的索引。

B-Tree是一种比较经典的数据结构,一般用于磁盘的储存中;在磁盘和数据库的中的单次IO是内存中单次IO的几倍消耗。二叉树、平衡二叉树、红黑树跟B-Tree相比IO的次数更多,所以数据库一般趋向于更少IO的B-tree。

B+Tree是B-Tree的一个变种,很多的MySQL存储引擎中用到了B+Tree。其比B-Tree的查找速度来的稳定,更趋近于二分查找。并且IO次数也更少。区间查找也更快。并且B+Tree底层的数据结构是自然排序的,排序能力更强一些。

下图为简化的b+tree image.png

虽然不同的存储引擎中都用到了B+Tree但是不同存储引擎,实现效果是不同的。

  • InnoDB是靠主键引用关联被索引的行
  • MyISAM的索引是根据数据的物理地址关联被索引的行
  • MyISAM用到了前缀压缩技术将索引压缩到了更小
  • InnoDB没有用到压缩技术,一般是用原始数据进行保存

存储引擎从索引的根节点开始查找,比较指针所指向的位置的值然后继续向下查找。极大的减少了IO,这样可以避免全表扫描。而叶子节点上端是没有值的,所有的值都在叶子节点的底部。这样可以使每次查找的时间趋近相同。