Mysql 堆与聚集索引全表扫描
我一直在谷歌上来回搜索,无法掌握磁盘上的表数据块是如何构造的 许多参考资料指出,执行完整表扫描会按顺序读取块(这意味着DB可以一次读取多个块),但我找不到任何实际描述在堆和聚集索引的情况下,块是如何保存在磁盘上的资源 堆不指定顺序,这是因为DB不关心从磁盘读取的块的顺序,但:Mysql 堆与聚集索引全表扫描,mysql,oracle,rdbms,clustered-index,full-table-scan,Mysql,Oracle,Rdbms,Clustered Index,Full Table Scan,我一直在谷歌上来回搜索,无法掌握磁盘上的表数据块是如何构造的 许多参考资料指出,执行完整表扫描会按顺序读取块(这意味着DB可以一次读取多个块),但我找不到任何实际描述在堆和聚集索引的情况下,块是如何保存在磁盘上的资源 堆不指定顺序,这是因为DB不关心从磁盘读取的块的顺序,但: 我仍然没有找到任何证据可以保证堆数据按顺序存储在磁盘上 对于聚集索引,结果的顺序确实很重要。在这种情况下,我无法理解DB如何在保持顺序的同时保持块的顺序。顺序读取是否仍然适用于聚集索引 任何描述在每种情况下块如何在磁盘上布
任何描述在每种情况下块如何在磁盘上布局的资源都会对您询问的MySQL有所帮助,这通常意味着默认的InnoDB存储引擎 InnoDB不将表存储为堆 InnoDB表始终存储为聚集索引,其中聚集索引是主键。因此,表扫描或多或少相当于聚集索引的索引扫描 InnoDB中的任何索引通常不会顺序存储在磁盘上。它存储为一个页面集合,其中页面的统一大小为16KB。索引明显比这大得多,并且随着时间的推移,插入和更新扩展了中间部分和结尾部分的索引。为了有效地执行此操作(即,无需重写整个表),随机插入和更新会导致页面无序。创建的新页面将放置在文件中有空间的任何位置 为了便于扫描所有页面,每个页面都包含指向下一页和上一页位置的链接。这些可能在文件中非常遥远,因此表扫描实际上不是连续的,它将涉及到文件中其他位置的许多搜索 InnoDB要求将页面加载到RAM中,然后才能在查询中实际使用它们。InnoDB缓冲池是一个固定大小的RAM分配,其中包含一组从磁盘加载的页面。一旦页面进入缓冲池,就可以非常快速地访问它们,并且几乎没有后续链接的开销。将页从磁盘读入缓冲池的开销要比在RAM中读取页的开销大几个数量级 因此,在MySQL的情况下:
- 没有堆
- 按聚集索引排序与磁盘上的顺序存储无关
- 无论如何,读取都是在RAM中进行的,所以磁盘上的物理布局与读取页面的顺序几乎没有关系