2009-11-12 111 views
3

我有一个几百万条记录的表。在生产过程中,我们发现有一种特定类型的查询需要几秒钟才能完成。如何避免mysql缓存

当我尝试在已复制生产数据的计算机上重现问题时,我在mysql客户端中运行了准确的查询(从慢速查询日志中获取),它花费了几秒钟的时间。如果我然后按下并重新输入,则需要0.01秒。

我查阅了文档以了解如何关闭缓存,以便始终如一地重现问题,并且想要测试添加索引是否有帮助。

这是我试过的:

RESET QUERY CACHE;平板电脑;

但是,在上述命令之后,再次运行相同的查询仍然只需要0.01秒。

我必须缺少一些东西。有任何想法吗?

+0

你已经试过SELECT SQL_NO_CACHE表。* FROM table ...? – Max 2009-11-12 15:57:19

回答

0

将表格加载到内存后,查询应该花费的时间会大大减少。如果生产框每次运行查询需要很长时间,我会开始查看内存使用情况。如果你发现你的生产箱交换了很多,我会考虑升级它的RAM。

0

的have_query_cache服务器系统变量指示查询缓存是否可用:

mysql> SHOW VARIABLES LIKE 'have_query_cache'; 
+------------------+-------+ 
| Variable_name | Value | 
+------------------+-------+ 
| have_query_cache | YES | 
+------------------+-------+ 

当使用标准MySQL二进制,此值始终为YES,即使查询缓存被禁用。

其他几个系统变量控制查询缓存操作。这些可以在启动mysqld时在选项文件或命令行中设置。查询缓存系统变量都具有以query_cache_开头的名称。它们在第5.1.3节“服务器系统变量”中进行了简要介绍,并提供了此处给出的其他配置信息。

http://dev.mysql.com/doc/refman/5.0/en/query-cache-configuration.html

4

您可以通过查询SQL_NO_CACHE告诉服务器不将结果存放在查询缓存:

SELECT SQL_NO_CACHE id, name FROM customer; 

除了查询缓存虽然,有很多更回事为了加快速度,MySQL内部缓存了有关表和索引的其他信息,以加快未来的查询速度。查询的第一次执行也会预热操作系统文件缓存。

您真正需要做的是查询EXPLAIN,并查看数据库引擎需要分析的行数。通过研究它如何使用表索引(或不是),您将更好地了解可能缺少哪些索引或构建查询的替代方法。

0

如果您无法关闭它,可以通过发出一组简单的更新语句来交换查询所选择的数据,从而使查询无效。

所以,如果你做到了。

update table set column = tmpval where id = 100; 
update table set column = originalval where id = 100; 

然后,当你再次查询它会花费一段时间。

此外,请确保您对原始查询做了解释,它将帮助您诊断比大多数事情更快的错误。