我有一个包含几百万条记录的表。在生产过程中,我们发现有一种特定类型的查询需要几秒钟才能完成。
当我尝试在复制了生产数据的机器上重现该问题时,我在mysql客户端中运行了准确的查询(从缓慢的查询日志中获得),正如预期的那样,这需要几秒钟时间。如果我随后按up和enter重复该操作,则需要0.01秒。
我查阅了文档以了解如何关闭缓存,以便能够一致地重现该问题,并希望测试添加索引是否会有所帮助。
这是我尝试过的:
重置查询缓存;刷新表;
但是,在执行完上述命令之后,再次运行相同的查询仍然只需要0.01秒。
我一定漏掉了什么。有什么想法吗?
发布于 2009-11-12 23:56:31
您可以通过在查询中包含SQL_NO_CACHE来告诉服务器不要将结果放在查询缓存中:
SELECT SQL_NO_CACHE id, name FROM customer;除了查询缓存之外,MySQL中还有更多的东西在加速,它缓存了关于表和索引的其他信息,以加快未来的查询速度。查询的第一次执行也将预热操作系统文件缓存。
您真正需要做的是对查询执行EXPLAIN操作,并查看数据库引擎需要分析的行数。通过探索它是如何使用(或不使用)表索引的,您将更好地了解哪些索引可能丢失,或者是构造查询的替代方法。
发布于 2009-11-12 23:54:09
一旦将表加载到内存中,查询所需的时间就会大大减少。如果production机器每次运行查询都需要很长时间,我就会开始查看内存使用情况。如果你发现你的生产机器交换了很多,我会考虑升级它的RAM。
发布于 2009-11-12 23:55:07
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
https://stackoverflow.com/questions/1723227
复制相似问题