我刚刚在我的MySQL数据库上打开慢速查询记录,将以下内容添加到/etc/mysql/my.cnf:
log_slow_queries = /var/log/mysql/mysql-slow.log
long_query_time = 1
Run Code Online (Sandbox Code Playgroud)
当我运行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`
...
Run Code Online (Sandbox Code Playgroud)
看原文mysql-slow.log,完整的查询是:
SELECT /*!40001 SQL_NO_CACHE */ * FROM `mytable`;
Run Code Online (Sandbox Code Playgroud)
所以mysqldumpslow只需用数字替换N(以帮助聚合类似的查询.)
所以,问题是,该查询来自何处以及该/*!40001 SQL_NO_CACHE */位意味着什么?
我可以说,它可能来自一个mysqldump正在进行备份的命令(因此不需要缓存数据),这看起来是否正确?如果是这样,因为它只读了32,000行,为什么需要199s呢?
在其他表上有一堆更类似的查询,需要100s,50s,更合理的3s,大多数有10-20,000行,最大有450,000行.
Bri*_*her 24
这/*!40001 SQL_NO_CACHE */意味着在mysql> = 4.0.1的版本中执行SELECT SQL_NO_CACHE * FROM mytable并且在早期版本中执行不带SQL_NO_CACHE的命令.
mysqldump也使用/*!40001 SQL_NO_CACHE */语法.
我不确定为什么你的查询会这么慢.
查询可能"慢",因为客户端(您的备份系统)必须读取表中的每一行; 这显然是199秒.
请注意,如果你做了类似的事情:
SELECT * FROM table LIMIT 100;
// read 50 rows
// sleep for 5 minutes
// read last 50 rows
Run Code Online (Sandbox Code Playgroud)
上面的查询将出现在慢速日志中,因为从它第一次启动时到完成它(通过向您发送最后请求的行)它花了5分钟.
小智 5
您可能会考虑进行调整,以使该查询的运行速度比它快,顺便说一句,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,干杯
| 归档时间: |
|
| 查看次数: |
22398 次 |
| 最近记录: |