执行SELECT操作时,每次从磁盘读取数据的方式如何?如何验证从磁盘读取数据?

时间:2016-07-18 09:05:20

标签: mysql mariadb

我们是否需要删除操作系统缓存? 我想从磁盘中读取数据,而不是从已禁用的缓存中读取数据

1. query_cache_type=OFF
2. query_cache_size=0

即便如此,当我执行Id = 2的选择操作时,innodb_buffer_pool_reads会发生变化。如果我选择Id = 3,则innodb_buffer_pool_reads没有变化。 如何从磁盘读取下一个值?有没有其他方法可以验证是否正从磁盘读取数据?

[编辑]谢谢大家的回复。

我正在尝试执行逆向工程,想要测试没有缓存的选择查询的执行速度。那么想要禁用所有缓存并从磁盘读取数据?

1 个答案:

答案 0 :(得分:1)

是的,要完全关闭查询缓存,请进行这两项设置。

要为单个SELECT禁用查询缓存,请执行SELECT SQL_NO_CACHE ...

但是......质量控制并不是唯一的缓存机制。对于InnoDB,buffer_pool缓存数据和索引。 (MyISAM使用其key_cache和操作系统的缓存)

通常,第一次执行查询(重新启动服务器后),需要命中磁盘。通常,之后执行的查询(或类似查询)不需要命中磁盘。由于“缓存”,MySQL将像必需的一样点击磁盘。

如果您要修改数据的其他连接是SELECT,请不要担心。 MySQL将确保更改缓存副本和/或磁盘副本。您将始终获得正确的值。

InnoDB以“块”(16KB,通常约100行)执行操作。这是磁盘I / O的单位。 Ids 1,2,3在同一个块中可能。 MySQL再次负责提取和更改。它可能读取块一次,缓存它很长时间,并最终写入一次,即使块中的行有很多变化。

那么“耐久性”如何发生?魔法。它涉及InnoDB日志文件以及对其执行的一些额外写入。那是另一个话题;解释这一切需要很长时间。