选择执行时的MySQL磁盘I / O.

时间:2017-08-04 02:42:47

标签: mysql io internals

我对mysql的低级原则有疑问。

让我假设我有一个包含4列且没有索引的表。

从A中选择*从A中选择第一列。

然后读取I / O与性能有区别。不是网络I / O.

我很好奇从磁盘读取数据的原则。

1 个答案:

答案 0 :(得分:1)

在MySQL的默认存储引擎InnoDB中,整行存储在一起。因此SELECT *SELECT first_column之间没有什么区别。它仍然必须执行I / O来加载包含每一行的页面,并且一旦完成,它就具有缓冲池中的所有列,因此读取更多列的成本没有显着增加。

有一个例外情况:如果在VARCHAR,VARBINARY,TEXT或BLOB列中有长字符串,那么不适合带有该行的页面的字符串部分将存储在数据库存储中其他位置的其他页面上(见https://www.percona.com/blog/2010/02/09/blob-storage-in-innodb/)。如果省略不需要的字符串列,则可以减少I / O,因为InnoDB不需要读取长字符串数据的额外页面。

如您在问题中所述,上述假设没有索引。如果你有索引,你可能会受益于覆盖索引效果:如果你只引用属于索引的列,InnoDB可以避免读取整行的页面。它只会读取包含引用索引条目的页面。这将有助于减少I / O.