mysql学习笔记3

71 阅读2分钟

索引

前面两章我记录了mysql中行记录的格式和页的形式,在数据页中通过槽可以很快的找到行记录。一页的大小是16kb,所以如果数据多了我们一个数据页存储不了就会存储在多页上。在多页的情况中我们查找数据应该是这样的:先定位到数据所在的页,再从该页中查找该数据。索引就帮助我们快速定位到数据所在的数据页,从而避免了我们从第一页遍历查询的情况发生。

一个简单的索引方案

在mysql的数据页中,存储的记录顺序是按照主键来进行排序的,如果插入的数据超过了一页的内存大小就会发生也分裂,分裂后的页数据也是这样按照主键的大小进行排序,前一页的最大主键会比后一页的最小主键小。

虽然主键的顺序是按照大小排序的但页的序号却不是按照大小来排序的,并且页与页之间并不是内存连续的。

我们要想快速的找到这个主键所在的页是哪一个就不能通过遍历查询的方式来查询,所以就设计了一一个目录,来记录页的主键值和页号的关系,每个目录项都包含以下两个内容:该页的最小记录值和该页的页号。

有了这个目录,我们在从多页中查询记录的过程就是这样的:先在目录上通过二分法找到应该在哪一页,到了该页后再对槽用二分法找到在那一组,对组的记录遍历就能查询到我们要找的记录。

这个目录就是索引的简单方案。

InnoDB引擎的索引

上面介绍的索引方案终究是一个简单的索引方案,在实际的使用中,上面提到的目录项和行数据其实一样,只是存储的内容不同而已,所以便将上面提到的目录项作为行数据来存储到页中,通过record_type 属性来区分该行记录是存储什么内容的。

随着索引记录的增多,记录索引的页最后也会分裂,索引页增多我们有需要快速找到索引页,所以效仿前面的方法,再为索引页建立索引,这样可以一直套下去直到最开始只有一页,我们通过这最开始的一页就能找到我们要找的数据。

这个就是B+树索引。