我在 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;
这准确吗?
如何计算其他指标,如内存使用情况,缓存使用情况,磁盘读取,磁盘写入,缓冲区获取
有人可以建议任何其他指标来比较两个数据库上“相同”查询的效果吗?
答案 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列。