mysql底层实现 | 青训营笔记

65 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天

索引原理底层:

数据库在存储数据的时候将数据存储到磁盘上,数据之间的结构通过B+tree进行连接。

没有索引的数据查询,没有索引查询会进行全表扫描,扫描第一页的时候会将附近的页也读取进来,这就是局部性原理:

局部性原理:

有三块内存页x,y,z相连,CPU读取x的时候,然后就会读取y和z到缓冲中。

全表扫描过程:

就是对所有数据进行逐一判定。

为什么不用二叉树:

字段递增出现倾斜的情况变成链表,磁盘中数据不是连续,无法利用局部性原理。

为什么不使用红黑树:

树的高度可能会太大,

节点只存储一个数据,且节点不是连续的,磁盘读取都是一页读取,不能利用到局部性原理。

为什么不适用BTree

由于非叶子节点之间存储了数据,非叶子节点没有使用链表进行连接,这样对于大范围查询需要花多次IO来检索数据。

为何选择B+Tree

  • 最下面一排节点之间,都存在一个单项指针,指向下一个节点位置,这样就比Btree更加适合范围查询。只需要定位第一个节点,然后就可以直接根据各节点之间的指针.
  • 节点分为叶节点和叶子节点,只有叶子节点存储数据,叶节点也就是非叶子节点不会存储数据,增大了数据的存储空间,通过添加一些冗余数据。

为什么需要用叶节点存储冗余数据,

  • 能不能将所有的索引数据、表数据全部放入到一个节点中存储呢?这样树的高度永远为1呀,是不是只需要经过一次磁盘IO啊。

聚簇索引查询数据:

首先会根据条件字段,去内存中找到聚簇索引的根节点,然后根据节点中记录的地址去找次级的叶节点,最后再根据叶节点中的指针地址,找到最下面的叶子节点,从而获取其中的行数据