MySql - 怎么从磁盘查找数据

咱们已经知道数据页的格式是这样的:
image.png
假设咱们要查询一个名字叫作张三的人,咱们是这样查的:数据库

  • 查找第一个数据页的第一条数据,根据描述数据的变长字段的长度列表和null值列表定位字段的值,进行匹配操做。
  • 根据描述数据的next_record找到第二条数据,同上面的匹配操做。
  • 当前数据页查找完了,根据数据页指向下一个数据页进行上面2个步骤操做。

因此这周非索引的,就至关于全表扫描,他会一个个数据页的每行进行查找。
若是咱们查找主键id为45的数据呢(假设每一个数据页10条),咱们是这样查的:spa

  • 经过索引找到数据页,此时数据页的id范围为41-50。
  • 而后根据二分查找定位到id为45的数据。

这个查找包括了两个东西,一个是主键,是递增的,因此咱们在定位到数据页的时候,能够用二分查找。另一个就是索引,MySql的索引是B+树结构,索引又分为聚族索引跟非聚族索引。
索引在磁盘中,也是经过数据页的形式,因此id=45查找的过程是这样的:
在最顶层的数据页中查找,发现45比101还小,因此他就往左边的数据页查找。
而后对比45和51,发现比51小,因而就定位数据页4。
而后在数据页4中,经过二分查找到45的id。
image.png
对于非聚族索引,查找的过程也是相似的,不一样的他的叶子节点存储的是索引对应的列的值以及索引的值,因此他还要经过索引的值继续上面的操做,也就是回表。
既然索引能够提高查询效率,那咱们能够多建几个索引吗?
咱们从这几个来考虑:blog

  1. 索引是占磁盘空间的,索引建的越多磁盘空间占的越多。索引提高查询效率其实就是已空间换时间。
  2. 索引是有序的,因此咱们对数据的新增、修改、删除,都会直接影响到索引的从新排序,进而影响咱们对数据库的操做。
相关文章
相关标签/搜索