我刚刚在我的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行。
答案 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,并查看两个系统的版本。由于不同版本的行为也略有不同。