SQL 查询的性能指标计算
Performance metrics calculation for SQL queries
我在 MySQL 服务器 .
上有两个数据库 A 和 B
A是原始数据库,B是从A派生的,改变了一些table的格式。因此,对于 db A 中的每个 table_A,在 db B 中都有一个相应的 table table_B,对于 table_A 中的每一行,在 table_B 中都有一个相应的行代表完全相同的 table 条目,格式不同。
我很确定解释 A 和 B 之间的这种“格式差异”与我要问的问题无关。
我实际上使用 Java、JDBC 来与 MySQL 服务器交互。
我有许多 "SELECT" 数据库 A 查询和数据库 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
最终目标是比较"same"查询在两个孪生数据库上的性能,看看“格式差异”对查询性能有什么影响.
我的问题:
如何计算查询执行的 CPU 时间?目前我做的是:
long startTime = System.currentTimeMillis();
ResultSet rs = stmt.executeQuery(QUERY);
long time = System.currentTimeMillis() - startTime;
这准确吗?
如何计算其他指标,例如内存使用量、缓存使用量、磁盘读取、磁盘写入、缓冲区获取
谁能建议任何其他指标来比较 "same" 查询在两个数据库上的性能?
有很多指标是您无法获得的。但这是我喜欢得到的一组:
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 列。
我在 MySQL 服务器 .
上有两个数据库 A 和 BA是原始数据库,B是从A派生的,改变了一些table的格式。因此,对于 db A 中的每个 table_A,在 db B 中都有一个相应的 table table_B,对于 table_A 中的每一行,在 table_B 中都有一个相应的行代表完全相同的 table 条目,格式不同。
我很确定解释 A 和 B 之间的这种“格式差异”与我要问的问题无关。
我实际上使用 Java、JDBC 来与 MySQL 服务器交互。
我有许多 "SELECT" 数据库 A 查询和数据库 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
最终目标是比较"same"查询在两个孪生数据库上的性能,看看“格式差异”对查询性能有什么影响.
我的问题:
如何计算查询执行的 CPU 时间?目前我做的是:
long startTime = System.currentTimeMillis(); ResultSet rs = stmt.executeQuery(QUERY); long time = System.currentTimeMillis() - startTime;
这准确吗?
如何计算其他指标,例如内存使用量、缓存使用量、磁盘读取、磁盘写入、缓冲区获取
谁能建议任何其他指标来比较 "same" 查询在两个数据库上的性能?
有很多指标是您无法获得的。但这是我喜欢得到的一组:
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 列。