select执行工作时的MySQL磁盘I/O

select执行工作时的MySQL磁盘I/O,mysql,io,internals,Mysql,Io,Internals,我对mysql的低级原理有疑问 假设我有一个表,有4列,没有索引 从A中选择*与从A中选择第一列 那么在读I/O性能上是否存在差异。不是网络I/O 我对从磁盘读取数据的原理很好奇 在MySQL的默认存储引擎InnoDB中,整行存储在一起。所以SELECT*和SELECT first\u列之间没有什么区别。它仍然需要进行I/O来加载包含每一行的页面,一旦完成了加载,它就拥有了缓冲池中的所有列,因此读取更多列的成本不会显著增加 有一种例外情况:如果在VARCHAR、VARBINARY、TEXT或BL

我对mysql的低级原理有疑问

假设我有一个表,有4列,没有索引

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

那么在读I/O性能上是否存在差异。不是网络I/O


我对从磁盘读取数据的原理很好奇

在MySQL的默认存储引擎InnoDB中,整行存储在一起。所以
SELECT*
SELECT first\u列
之间没有什么区别。它仍然需要进行I/O来加载包含每一行的页面,一旦完成了加载,它就拥有了缓冲池中的所有列,因此读取更多列的成本不会显著增加

有一种例外情况:如果在VARCHAR、VARBINARY、TEXT或BLOB列中有长字符串,则字符串中不适合该行的部分将存储在数据库存储中其他位置的其他页面上(请参阅)。如果省略不需要的字符串列,可以减少I/O,因为InnoDB不需要为长字符串数据读取额外的页面


正如您在问题中所述,上述假设不存在索引。如果您确实有索引,您可能会受益于覆盖索引效果:如果您只引用作为索引一部分的列,InnoDB可以避免读取整行的页面。它将只读取包含引用索引项的页面。这将有助于减少I/O。

我没有因为格式问题而对此进行升级。不管你怎么说,都要把那句模棱两可的话说出来。非常感谢。我理解了一些。然后我真正的问题是,我必须使表有10列,3列有长字符串,但没有索引。那么,制作三种类型的表格比制作一个表格更有效吗?@Dongyangheo,制作一个表格,除非你有可以测量的问题。不要尝试过早的优化。但也要避免使用
SELECT*