SQL查询的性能指标计算

时间:2015-07-29 16:32:48

标签: mysql performance jdbc time cpu-usage

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

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

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

我实际上使用 Java JDBC 来与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

最终目标是比较两个双dbs上“相同”查询的性能,看看“格式差异”对查询性能有何影响。

我的问题:

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

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

    这准确吗?

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

  • 有人可以建议任何其他指标来比较两个数据库上“相同”查询的效果吗?

1 个答案:

答案 0 :(得分:0)

您无法获得许多指标。但这是我想要的一套:

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列。