代码之家  ›  专栏  ›  技术社区  ›  joedevon

有没有办法在MySQL中检查行而不使用慢日志?

  •  5
  • joedevon  · 技术社区  · 15 年前

    我正在为一个自主开发的应用程序建立一些配置文件信息。我希望调试页显示发送的查询以及检查了多少行,而不假设打开了慢日志,更不用说解析了。

    早在2006年,我想要的是 not possible . 今天还是这样吗?

    我看到彼得·扎伊采夫 technique 其中您:

    1. 跑步 FLUSH STATUS;
    2. 跑步 SHOW STATUS LIKE "Handler%";

    处理程序读取下一个 =42250表示在此扫描期间分析了42250行

    听起来,如果MySQL只检查索引,那么它应该给您一个数字。但是,是否有一组状态变量可以进行轮询、相加并找出检查的行数?还有其他想法吗?

    4 回复  |  直到 8 年前
        1
  •  5
  •   Mark Amery Harley Holcombe    8 年前

    比2006年稍微好一点。您可以发出SHOW SESSION STATUS before和after,然后查看每个处理程序的读取计数,以便能够知道检查的行数。

    之后 ,因为它会记住以前的值)。

    我知道这与您最初的问题无关,但除了检查行之外,还有其他一些昂贵的组件需要查询。如果选择通过慢速日志执行此操作,则应检查此修补程序:

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

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

        2
  •  2
  •   Marc Alff    13 年前

    从5.6.3开始,MySQL performance_schema数据库还公开performance_schema.events_current等表中的语句统计信息。

    语句收集的统计信息包括“ROWS\u 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

        3
  •  1
  •   Quassnoi    15 年前

    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_key , 101 在里面 read_next 0 两者都有 read_rnd read_rnd_next ,尽管实际的行查找发生在第二个查询中。

        4
  •  0
  •   Michiel Overeem    15 年前

    在查询前面加上EXPLAIN。在MySQL中,它将显示查询的执行路径、检查了哪些表以及为每个表检查的行数。

    这是 documentation .