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

时间:2009-10-28 14:42:11

标签: mysql performance

我正在为自己开发的应用构建一些个人资料信息。我希望调试页面显示发送的查询以及检查了多少行而不假设slow_log已打开,更不用说解析它了。

早在2006年,我想要的是not possible。今天仍然如此吗?

我看到Peter Zaitsev有technique你在哪里:

  1. 运行FLUSH STATUS;
  2. 运行查询。
  3. 运行SHOW STATUS LIKE "Handler%";
  4. 然后在输出中:

      

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

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

4 个答案:

答案 0 :(得分:4)

它比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”。

答案 1 :(得分:2)

从5.6.3开始,MySQL performance_schema数据库还在诸如performance_schema.events_statements_current之类的表中公开语句统计信息。

语句收集的统计信息包括'ROWS_EXAMINED'列。

请参阅 http://dev.mysql.com/doc/refman/5.6/en/events-statements-current-table.html

从那里汇总统计数据以提供摘要。

请参阅 http://dev.mysql.com/doc/refman/5.6/en/statement-summary-tables.html

答案 2 :(得分:1)

来自documentation

  

Handler_read_rnd

     

基于固定位置读取行的请求数。如果您要执行大量需要对结果进行排序的查询,则此值很高。您可能有很多查询要求MySQL扫描整个表,或者您有不正确使用密钥的连接。

     

Handler_read_rnd_next

     

读取数据文件中下一行的请求数。如果您正在进行大量的表扫描,则此值很高。通常,这表明您的表没有正确编入索引,或者您的查询未编写以利用您拥有的索引。

read_rnd*表示使用fullscan读取实际的表行。

请注意,如果索引扫描与行查找相结合,它将不会显示任何内容,它仍会被视为键读取。

对于这样的架构:

CREATE TABLE mytable (id INT NOT NULL PRIMARY KEY, data VARCHAR(50) NOT NULL)

INSERT
INTO    mytable
VALUES  …

SELECT  id
FROM    mytable
WHERE   id BETWEEN 100 AND 200

SELECT  *
FROM    mytable
WHERE   id BETWEEN 100 AND 200

,后两个查询将返回1中的read_key101中的read_next以及0和{{read_rnd中的read_rnd_next 1}},尽管实际的行查找发生在第二个查询中。

答案 3 :(得分:0)

使用EXPLAIN预置查询。在MySQL中将显示查询的执行路径,检查哪些表以及为每个表检查的行数。

这是documentation