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

Tom*_*Tom 14 mysql

我刚刚在我的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 */语法.

我不确定为什么你的查询会这么慢.


And*_*rew 5

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

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

SELECT * FROM table LIMIT 100;

// read 50 rows

// sleep for 5 minutes

// read last 50 rows
Run Code Online (Sandbox Code Playgroud)

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

  • 实际上,如果它通过ssh(通过gzip)发送,可以保持打开直到数据全部传输... (2认同)

小智 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,干杯