在MySQL的慢查询日志中,“SELECT / *!N SQL_NO_CACHE * / * FROM`mytable`”是什么意思?

时间:2011-11-27 00:42:50

标签: mysql

我刚刚在我的MySQL数据库上打开slow query logging,将以下内容添加到/etc/mysql/my.cnf

log_slow_queries = /var/log/mysql/mysql-slow.log
long_query_time = 1

当我运行mysqldumpslow时,它会输出以下内容:

Reading mysql slow query log from mysql-slow.log
Count: 1  Time=199.23s (199s)  Lock=0.00s (0s)  Rows=32513.0 (32513), ...
 SELECT /*!N SQL_NO_CACHE */ * FROM `mytable`

...

查看原始mysql-slow.log,完整查询为:

SELECT /*!40001 SQL_NO_CACHE */ * FROM `mytable`;

所以mysqldumpslow只是将数字替换为N(以帮助汇总类似的查询。)

所以,问题是,该查询来自何处以及/*!40001 SQL_NO_CACHE */位的含义是什么?

最好的我可以说,它可能来自一个mysqldump命令正在进行备份(因此不想要缓存数据),这看起来是否正确?如果是这样,因为它只读了32,000行,为什么需要199s?

在其他表上有一堆更类似的查询需要100s,50s,更合理的3s,大多数有10-20,000行,最大有450,000行。

4 个答案:

答案 0 :(得分:23)

/*!40001 SQL_NO_CACHE */表示在mysql> = 4.0.1版本中执行SELECT SQL_NO_CACHE * FROM mytable,在早期版本中执行不带SQL_NO_CACHE的命令。

mysqldump也使用/*!40001 SQL_NO_CACHE */语法。

我不确定为什么你的查询会如此缓慢。

答案 1 :(得分:5)

查询可能“慢”,因为客户端(您的备份系统)必须读取表中的每一行;这显然是199秒。

请注意,如果你做了类似的事情:

SELECT * FROM table LIMIT 100;

// read 50 rows

// sleep for 5 minutes

// read last 50 rows

上面的查询会出现在慢速日志中,因为从第一次启动时开始到完成时(通过向您发送最后请求的行)它需要5分钟。

答案 2 :(得分:4)

您可以考虑使用调优来使此查询运行得比它快,顺便说一句,SQL_NO_CACHE意味着此查询将在没有资格存储到查询缓存中的情况下运行。例如,您可以使用此HINT SQL_NO_CACHE来避免缓存此查询,以便测试执行时间。

检查出来:http://dev.mysql.com/doc/refman/5.0/en/query-cache-in-select.html

用于查询的更多提示:http://www.petefreitag.com/item/613.cfm

干杯,WB

答案 3 :(得分:-1)

从我的工作中,我也遇到了同样的问题然后我尝试了两种方法来解决它。

首先,我增加了mysql_query_cache的大小并增加了本地机器的空间。

其次,我检查了远程服务器mysql_query_cache的大小并增加了临时目录空间。

因为,我从研究中得到的结论是,这个系统在两个方面都有效,让我们意识到我们必须增加特定地方的空间。

因此,请具体说明您使用的mysqldum p,并查看两个系统的版本。由于不同版本的行为也略有不同。