2010-02-08 62 views
0

当我在mysql中禁用查询缓存时,查询仍然被缓存。据我了解这是因为OS文件系统缓存。如何防止文件系统缓存这些数据。我在开发WIndows 7,但它可能是Linux。防止MySQL查询的文件系统缓存

+1

您如何知道缓存的内容,以及有什么问题?请提供具体信息。 – Henning 2010-02-08 12:17:51

+0

我正在运行查询 mysql> SHOW GLOBAL STATUS LIKE'Qcache%'; 并且它返回所有零值,这意味着没有启用查询缓存。 下一个正在运行的查询对20.000行的表 mysql> SELECT COUNT(*)FROM bigtable; 返回1行(2.55秒) 再次运行 mysql> SELECT COUNT(*)FROM bigtable; 返回集中的1行(0.52秒) 等 --- 我不想使用缓存,因为我需要运行相同的查询进行基准测试。 – Dima 2010-02-08 14:12:52

回答

0

那么现在我可以自己回答我的问题。为防止缓存第二次和下一次查询需要设置innodb_buffer_pool_size = 0配置选项。这个由mysql用来将数据交换到内存中的缓冲区,以及所有下一个查询都使用内存而不是HD进行操作。

0

MySQL中没有查询文件系统缓存。

当我禁用MySQL查询缓存,查询仍缓存

你如何禁用它,你怎么知道的查询仍缓存?为什么你不希望他们被缓存?

+0

我正在运行查询 mysql> SHOW GLOBAL STATUS LIKE'Qcache%'; 并且它返回所有零值,这意味着没有启用查询缓存。 下一个正在运行的查询对20.000行的表 mysql> SELECT COUNT(*)FROM bigtable; 返回1行(2.55秒) 再次运行 mysql> SELECT COUNT(*)FROM bigtable; 返回集中的1行(0.52秒) 等 --- 我不想使用缓存,因为我需要运行相同的查询进行基准测试。 – Dima 2010-02-08 14:13:19

+0

当您在ISAM表上创建COUNT(*)时,只会读取表头。实际的行数存储在表头中并快速获取。它被缓存在Windows文件缓存中。这与查询缓存没有关系。 – 2010-02-08 16:00:19

+0

恩,count(*)不是很好的例子。我使用InnoDb表,查询可能是选择*或选择ID或其他任何。 – Dima 2010-02-08 16:18:46

0

您需要缓冲池比您的数据(Innodb TableSpaces的总大小)大一点(比如10%),因为它不仅包含数据页 - 它还包含自适应哈希索引,插入缓冲区,还需要一些锁时间。虽然它并不重要 - 对于大多数工作负载,如果您的Innodb缓冲池比数据库大小小10%,那么您不会失去太多的优势