代码之家  ›  专栏  ›  技术社区  ›  dongyoung heo

选择执行工作时MySQL磁盘I/O

  •  -1
  • dongyoung heo  · 技术社区  · 7 年前

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

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

    那么,读I/O作为性能是否存在差异。非网络输入/输出。

    1 回复  |  直到 7 年前
        1
  •  2
  •   Bill Karwin    7 年前

    在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可以避免读取整行的页面。它将只读取包含引用索引项的页面。这将有助于减少输入/输出。