有没有办法在没有慢速日志的情况下在MySQL中获取rows_examined?

joe*_*von 5 mysql performance

我正在为本土应用程序构建一些配置文件信息.我希望调试页面显示发送的查询以及检查了多少行而不假设slow_log已打开,更不用说解析它了.

早在2006年,我想要的就是不可能.今天仍然如此吗?

我看到Peter Zaitsev有一种技巧,你可以:

  1. FLUSH STATUS;
  2. 运行查询.
  3. SHOW STATUS LIKE "Handler%";

然后在输出中:

Handler_read_next = 42250表示在此扫描期间分析了42250行

听起来好像MySQL只检查索引,它应该给你数字.但是有没有一组状态变量你可以轮询,加起来并找出检查了多少行?还有其他想法吗?

Mor*_*ker 6

它比 2006 年略好。您可以在前后发出 SHOW SESSION STATUS,然后查看每个 Handler_read_* 计数,以便能够判断检查的行数。

真的没有别的办法了。虽然服务器协议有一个标志来说明是否发生了表扫描,但它不会公开rows_examined。即使像 MySQL 的查询分析器这样的工具也必须通过在之前/之后运行 SHOW SESSION STATUS 来工作(尽管我认为它只在 之后运行 SHOW SESSION STATUS ,因为它会记住以前的值)。

我知道这与您的原始问题无关,但是除了rows_examined 之外,还有其他昂贵的查询组件。如果您选择通过慢速日志执行此操作,则应查看此补丁:

http://www.percona.com/docs/wiki/patches:microslow_innodb#changes_to_the_log_format

我可以推荐寻找“Disk_tmp_table: Yes”和“Disk_filesort: Yes”。


Qua*_*noi 1

来自文档

\n
\n

Handler_read_rnd

\n

基于固定位置读取一行的请求数。如果您正在进行大量需要对结果进行排序的查询,则该值会很高。您可能有很多查询需要 MySQL 扫描整个表,或者您有未正确使用键的联接。

\n

Handler_read_rnd_next

\n

读取数据文件中下一行的请求数。如果您进行大量表扫描,则该值会很高。一般来说,这表明您的表没有正确索引,或者您的查询没有编写来利用您拥有的索引。

\n
\n

read_rnd*意味着通过全扫描读取实际的表行。

\n

请注意,如果有索引扫描与行查找相结合,它不会显示任何内容,它仍然算作键读取。

\n

对于这样的模式:

\n
CREATE TABLE mytable (id INT NOT NULL PRIMARY KEY, data VARCHAR(50) NOT NULL)\n\nINSERT\nINTO    mytable\nVALUES  \xe2\x80\xa6\n\nSELECT  id\nFROM    mytable\nWHERE   id BETWEEN 100 AND 200\n\nSELECT  *\nFROM    mytable\nWHERE   id BETWEEN 100 AND 200\n
Run Code Online (Sandbox Code Playgroud)\n

,后两个查询都将返回1in read_key101inread_next以及0inread_rndread_rnd_next,尽管实际的行查找发生在第二个查询中。

\n