Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 堆与聚集索引全表扫描_Mysql_Oracle_Rdbms_Clustered Index_Full Table Scan - Fatal编程技术网

Mysql 堆与聚集索引全表扫描

Mysql 堆与聚集索引全表扫描,mysql,oracle,rdbms,clustered-index,full-table-scan,Mysql,Oracle,Rdbms,Clustered Index,Full Table Scan,我一直在谷歌上来回搜索,无法掌握磁盘上的表数据块是如何构造的 许多参考资料指出,执行完整表扫描会按顺序读取块(这意味着DB可以一次读取多个块),但我找不到任何实际描述在堆和聚集索引的情况下,块是如何保存在磁盘上的资源 堆不指定顺序,这是因为DB不关心从磁盘读取的块的顺序,但: 我仍然没有找到任何证据可以保证堆数据按顺序存储在磁盘上 对于聚集索引,结果的顺序确实很重要。在这种情况下,我无法理解DB如何在保持顺序的同时保持块的顺序。顺序读取是否仍然适用于聚集索引 任何描述在每种情况下块如何在磁盘上布

我一直在谷歌上来回搜索,无法掌握磁盘上的表数据块是如何构造的

许多参考资料指出,执行完整表扫描会按顺序读取块(这意味着DB可以一次读取多个块),但我找不到任何实际描述在堆和聚集索引的情况下,块是如何保存在磁盘上的资源

堆不指定顺序,这是因为DB不关心从磁盘读取的块的顺序,但:

  • 我仍然没有找到任何证据可以保证堆数据按顺序存储在磁盘上
  • 对于聚集索引,结果的顺序确实很重要。在这种情况下,我无法理解DB如何在保持顺序的同时保持块的顺序。顺序读取是否仍然适用于聚集索引

  • 任何描述在每种情况下块如何在磁盘上布局的资源都会对您询问的MySQL有所帮助,这通常意味着默认的InnoDB存储引擎

    InnoDB不将表存储为堆

    InnoDB表始终存储为聚集索引,其中聚集索引是主键。因此,表扫描或多或少相当于聚集索引的索引扫描

    InnoDB中的任何索引通常不会顺序存储在磁盘上。它存储为一个页面集合,其中页面的统一大小为16KB。索引明显比这大得多,并且随着时间的推移,插入和更新扩展了中间部分和结尾部分的索引。为了有效地执行此操作(即,无需重写整个表),随机插入和更新会导致页面无序。创建的新页面将放置在文件中有空间的任何位置

    为了便于扫描所有页面,每个页面都包含指向下一页和上一页位置的链接。这些可能在文件中非常遥远,因此表扫描实际上不是连续的,它将涉及到文件中其他位置的许多搜索

    InnoDB要求将页面加载到RAM中,然后才能在查询中实际使用它们。InnoDB缓冲池是一个固定大小的RAM分配,其中包含一组从磁盘加载的页面。一旦页面进入缓冲池,就可以非常快速地访问它们,并且几乎没有后续链接的开销。将页从磁盘读入缓冲池的开销要比在RAM中读取页的开销大几个数量级

    因此,在MySQL的情况下:

    • 没有堆
    • 按聚集索引排序与磁盘上的顺序存储无关
    • 无论如何,读取都是在RAM中进行的,所以磁盘上的物理布局与读取页面的顺序几乎没有关系

    您是在询问或?这是RDBMS的两种不同实现。最好的答案取决于你问的是哪一个。我实际上认为这两个会使用相同的原则,但就这一点来说,让我们假设MySQL:)@BillkarWinThank Bill。这很有帮助。其他引擎(不是MySql)是否按顺序存储数据?当使用聚集索引时,这是如何工作的?我对其他引擎不太熟悉,但我认为它们不太熟悉。按顺序存储数据有什么好处?至少在OLTP数据库中,应该避免表扫描。为他们进行优化没有抓住重点。顺序存储也会使在表中间进行更新/插入变得更加昂贵,因为单行更新需要将整个表从该点重写到结束。此外,聚集索引是查找的优化,而不是表扫描。我不希望集群索引与顺序存储一起使用。