【问题标题】:Performance metrics calculation for SQL queriesSQL 查询的性能指标计算
【发布时间】:2015-07-29 16:32:47
【问题描述】:

我在 MySQL 服务器上有两个数据库 A 和 B。

A 是原始数据库,B 是从 A 更改某些表的格式派生而来的。因此,对于 db A 中的每个 table_A,在 db B 中都有一个相应的表 table_B,对于 table_A 中的每一行,table_B 中都有一个相应的行,以不同的格式表示完全相同的表条目。

我很确定解释 A 和 B 之间的这种“格式差异”与我要问的问题无关。

我实际上使用 JavaJDBC 来连接 MySQL 服务器。

我有许多对 db A 的“SELECT”查询和对 db B 的等效查询。我想重复执行它们并计算一些指标,如下所示:

execute SELECT query on db A and calculate metrics;
execute equivalent SELECT query on db B and calculate metrics;
UPDATE data stored in db A and db B by a percentage 
loop

最终目标是比较“相同”查询在两个孪生数据库上的性能,看看“格式差异”对查询性能有何影响。

我的问题:

  • 如何计算查询执行的 CPU 时间?目前我做的是:

    long startTime = System.currentTimeMillis(); ResultSet rs = stmt.executeQuery(QUERY); long time = System.currentTimeMillis() - startTime;

    这准确吗?

  • 如何计算其他指标,例如内存使用、缓存使用、磁盘读取、磁盘写入、缓冲区获取

  • 谁能建议任何其他指标来比较两个数据库上“相同”查询的性能?

【问题讨论】:

    标签: mysql performance jdbc time cpu-usage


    【解决方案1】:

    有很多指标是您无法获得的。但这是我喜欢的一套:

    FLUSH STATUS;
    SELECT ...; -- or whatever query
    SHOW SESSION STATUS LIKE 'Handler%';
    

    最后一个命令可能会给出类似的东西

    mysql> SHOW SESSION STATUS LIKE 'Handler%';
    +----------------------------+-------+
    | Variable_name              | Value |
    +----------------------------+-------+
    | Handler_commit             | 1     |
    | Handler_delete             | 0     |
    | Handler_discover           | 0     |
    | Handler_external_lock      | 2     |
    | Handler_mrr_init           | 0     |
    | Handler_prepare            | 0     |
    | Handler_read_first         | 1     |
    | Handler_read_key           | 1     |
    | Handler_read_last          | 0     |
    | Handler_read_next          | 5484  |  -- rows in the table; so it did a table scan
    | Handler_read_prev          | 0     |
    | Handler_read_rnd           | 7     |
    | Handler_read_rnd_next      | 14    |
    | Handler_rollback           | 0     |
    | Handler_savepoint          | 0     |
    | Handler_savepoint_rollback | 0     |
    | Handler_update             | 0     |
    | Handler_write              | 13    |  -- wrote to a tmp table 13 rows after a GROUP BY
    +----------------------------+-------+
    18 rows in set (0.00 sec)
    

    缓存来来去去,因此时间甚至可以变化 10 倍。另一方面,处理程序非常一致。它们让我了解正在发生的事情。

    如果您通过 JDBC 运行,请像运行非 SELECT 一样运行 FLUSH;像 SELECT 一样运行 SHOW,它会为您提供 2 列。

    【讨论】:

    • 非常感谢,我一定要去看看这些东西! (看来我需要更多的声望来支持你,对不起!)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多