2.21 单条SQL性能trace
这个功能与MySQL的profile功能类似,用于统计一条查询在dble内部的各个阶段的耗时情况,用来发现性能瓶颈,改进SQL或者dble配置,达到提高性能的目的。 此功能为session 级别。
1. 可以通过此命令检查trace功能是否开启
mysql> select @@trace;
+---------+
| @@trace |
+---------+
| 0 |
+---------+
1 row in set (0.02 sec)
2. 开启 trace 功能
mysql> set trace =1;
Query OK, 0 rows affected (0.09 sec)
mysql> select @@trace;
+---------+
| @@trace |
+---------+
| 1 |
+---------+
1 row in set (0.00 sec)
3. 单节点查询的trace结果举例
mysql> select * from sharding_two_node where id =1;
+----+--------+-----------+
| id | c_flag | c_decimal |
+----+--------+-----------+
| 1 | 1 | 1.0000 |
+----+--------+-----------+
1 row in set (0.02 sec)
mysql> show trace;
+-------------------+-----------+-----------+--------------+---------------+---------------------------------------------+
| OPERATION | START(ms) | END(ms) | DURATION(ms) | SHARDING_NODE | SQL/REF |
+-------------------+-----------+-----------+--------------+---------------+---------------------------------------------+
| Read SQL | 0.0 | 0.1085 | 0.1085 | - | - |
| Parse SQL | 0.1085 | 0.49607 | 0.38757 | - | - |
| Route Calculation | 0.49607 | 1.274142 | 0.778072 | - | - |
| Prepare to Push | 1.274142 | 1.560543 | 0.286401 | - | - |
| Execute SQL | 1.560543 | 18.711851 | 17.151308 | dn1 | select * from sharding_two_node where id =1 |
| Fetch result | 18.711851 | 18.978213 | 0.266362 | dn1 | select * from sharding_two_node where id =1 |
| Write to Client | 18.711851 | 19.276344 | 0.564493 | - | - |
| Over All | 0.0 | 19.276344 | 19.276344 | - | - |
+-------------------+-----------+-----------+--------------+---------------+---------------------------------------------+
8 rows in set (0.00 sec)
4. 多节点查询的trace结果举例
mysql> select * from sharding_two_node ;
+-----+--------+-----------+
| id | c_flag | c_decimal |
+-----+--------+-----------+
| 513 | 513 | 513.0000 |
| 514 | 514 | 514.0000 |
| 515 | 515 | 515.0000 |
| 516 | 516 | 516.0000 |
| 1 | 1 | 1.0000 |
| 2 | 2 | 2.0000 |
| 3 | 3 | 3.0000 |
| 4 | 4 | 4.0000 |
| 5 | 5 | 5.0000 |
| 7 | 7 | 7.0000 |
| 8 | 8 | 8.0000 |
| 9 | 9 | 9.0000 |
| 10 | 10 | 10.0000 |
| 11 | 11 | 11.0000 |
| 12 | 12 | 12.0000 |
+-----+--------+-----------+
15 rows in set (0.01 sec)
mysql> show trace;
+-------------------+-----------+----------+--------------+---------------+-------------------------------------------+
| OPERATION | START(ms) | END(ms) | DURATION(ms) | SHARDING_NODE | SQL/REF |
+-------------------+-----------+----------+--------------+---------------+-------------------------------------------+
| Read SQL | 0.0 | 0.079175 | 0.079175 | - | - |
| Parse SQL | 0.079175 | 0.637315 | 0.55814 | - | - |
| Route Calculation | 0.637315 | 1.046389 | 0.409074 | - | - |
| Prepare to Push | 1.046389 | 1.465238 | 0.418849 | - | - |
| Execute SQL | 1.465238 | 8.141409 | 6.676171 | dn1 | SELECT * FROM sharding_two_node LIMIT 100 |
| Execute SQL | 1.465238 | 7.59109 | 6.125852 | dn2 | SELECT * FROM sharding_two_node LIMIT 100 |
| Fetch result | 8.141409 | 8.817824 | 0.676415 | dn1 | SELECT * FROM sharding_two_node LIMIT 100 |
| Fetch result | 7.59109 | 8.366718 | 0.775628 | dn2 | SELECT * FROM sharding_two_node LIMIT 100 |
| Write to Client | 7.59109 | 9.324157 | 1.733067 | - | - |
| Over All | 0.0 | 9.324157 | 9.324157 | - | - |
+-------------------+-----------+----------+--------------+---------------+-------------------------------------------+
10 rows in set (0.00 sec)
5. 多节点写入的SQL 的trace结果举例,事实上,这是一个隐式分布式事务
mysql> insert into sharding_two_node values(15,'15',15),(519,'519',519);
Query OK, 2 rows affected (0.06 sec)
mysql> show trace;
+---------------------------------+-----------+-----------+--------------+---------------+--------------------------------------------------------+
| OPERATION | START(ms) | END(ms) | DURATION(ms) | SHARDING_NODE | SQL/REF |
+---------------------------------+-----------+-----------+--------------+---------------+--------------------------------------------------------+
| Read SQL | 0.0 | 0.131959 | 0.131959 | - | - |
| Parse SQL | 0.131959 | 0.601637 | 0.469678 | - | - |
| Route Calculation | 0.601637 | 0.825479 | 0.223842 | - | - |
| Prepare to Push | 0.825479 | 1.025374 | 0.199895 | - | - |
| Execute SQL | 1.025374 | 27.095675 | 26.070301 | dn1 | INSERT INTO sharding_two_node VALUES (15, '15', 15) |
| Execute SQL | 1.025374 | 25.023911 | 23.998537 | dn2 | INSERT INTO sharding_two_node VALUES (519, '519', 519) |
| Fetch result | 27.095675 | 27.405046 | 0.309371 | dn1 | INSERT INTO sharding_two_node VALUES (15, '15', 15) |
| Fetch result | 25.023911 | 26.478398 | 1.454487 | dn2 | INSERT INTO sharding_two_node VALUES (519, '519', 519) |
| Distributed Transaction Prepare | 27.405046 | 27.736411 | 0.331365 | - | - |
| Distributed Transaction Commit | 27.736411 | 57.426311 | 29.6899 | - | - |
| Write to Client | 25.023911 | 57.428266 | 32.404355 | - | - |
| Over All | 0.0 | 57.428266 | 57.428266 | - | - |
+---------------------------------+-----------+-----------+--------------+---------------+--------------------------------------------------------+
12 rows in set (0.00 sec)
6. 复杂查询的trace结果举例
mysql> select count(*) from sharding_two_node;
+----------+
| COUNT(*) |
+----------+
| 20 |
+----------+
1 row in set (0.01 sec)
mysql> show trace;
+-----------------------+-----------+-----------+--------------+-----------------+--------------------------------------------------------------------------+
| OPERATION | START(ms) | END(ms) | DURATION(ms) | SHARDING_NODE | SQL/REF |
+-----------------------+-----------+-----------+--------------+-----------------+--------------------------------------------------------------------------+
| Read SQL | 0.0 | 0.08553 | 0.08553 | - | - |
| Parse SQL | 0.08553 | 0.56987 | 0.48434 | - | - |
| Try Route Calculation | 0.56987 | 0.71698 | 0.14711 | - | - |
| Try to Optimize | 0.71698 | 1.237487 | 0.520507 | - | - |
| Execute SQL | 1.237487 | 9.091029 | 7.853542 | dn1.0 | select COUNT(*) as `_$COUNT$_rpda_0` from `sharding_two_node` LIMIT 100 |
| Fetch result | 9.091029 | 10.186782 | 1.095753 | dn1.0 | select COUNT(*) as `_$COUNT$_rpda_0` from `sharding_two_node` LIMIT 100 |
| Execute SQL | 1.237487 | 8.348635 | 7.111148 | dn2.0 | select COUNT(*) as `_$COUNT$_rpda_0` from `sharding_two_node` LIMIT 100 |
| Fetch result | 8.348635 | 9.342241 | 0.993606 | dn2.0 | select COUNT(*) as `_$COUNT$_rpda_0` from `sharding_two_node` LIMIT 100 |
| MERGE | 8.721543 | 10.289905 | 1.568362 | merge.1 | dn1.0; dn2.0 |
| ORDERED_GROUP | 8.726919 | 10.424309 | 1.69739 | ordered_group.1 | merge.1 |
| LIMIT | 9.020162 | 10.499574 | 1.479412 | limit.1 | ordered_group.1 |
| SHUFFLE_FIELD | 9.023584 | 10.501529 | 1.477945 | shuffle_field.1 | limit.1 |
| Write to Client | 9.072457 | 11.52055 | 2.448093 | - | - |
| Over All | 0.0 | 11.52055 | 11.52055 | - | - |
+-----------------------+-----------+-----------+--------------+-----------------+--------------------------------------------------------------------------+
14 rows in set (0.03 sec)
7. 子查询的trace结果举例
mysql> select count(*) from sharding_two_node where id =(select id from sharding_two_node where id=1);
+----------+
| COUNT(*) |
+----------+
| 1 |
+----------+
1 row in set (0.03 sec)
mysql> show trace;
+-----------------------+-----------+-----------+--------------+--------------------+-------------------------------------------------------------------------------------------------------------------+
| OPERATION | START(ms) | END(ms) | DURATION(ms) | SHARDING_NODE | SQL/REF |
+-----------------------+-----------+-----------+--------------+--------------------+-------------------------------------------------------------------------------------------------------------------+
| Read SQL | 0.0 | 0.063047 | 0.063047 | - | - |
| Parse SQL | 0.063047 | 0.491182 | 0.428135 | - | - |
| Try Route Calculation | 0.491182 | 0.799576 | 0.308394 | - | - |
| Try to Optimize | 0.799576 | 2.347412 | 1.547836 | - | - |
| Execute SQL | 2.347412 | 11.183808 | 8.836396 | dn1.0 | select `sharding_two_node`.`id` as `autoalias_scalar` from `sharding_two_node` where id = 1 LIMIT 2 |
| Fetch result | 11.183808 | 12.360691 | 1.176883 | dn1.0 | select `sharding_two_node`.`id` as `autoalias_scalar` from `sharding_two_node` where id = 1 LIMIT 2 |
| MERGE | 11.889546 | 12.436445 | 0.546899 | merge.1 | dn1.0 |
| LIMIT | 11.894923 | 12.483364 | 0.588441 | limit.1 | merge.1 |
| SHUFFLE_FIELD | 11.896389 | 12.48483 | 0.588441 | shuffle_field.1 | limit.1 |
| SCALAR_SUB_QUERY | 12.038123 | 12.485808 | 0.447685 | scalar_sub_query.1 | shuffle_field.1 |
| Generate New Query | 12.485808 | 13.824463 | 1.338655 | - | - |
| Execute SQL | 13.824463 | 26.749647 | 12.925184 | dn1.1 | scalar_sub_query.1; select COUNT(*) as `_$COUNT$_rpda_0` from `sharding_two_node` where sharding_two_node.id = 1 |
| Fetch result | 26.685134 | 28.753476 | 2.068342 | dn1.1 | scalar_sub_query.1; select COUNT(*) as `_$COUNT$_rpda_0` from `sharding_two_node` where sharding_two_node.id = 1 |
| MERGE | 26.954918 | 29.091683 | 2.136765 | merge.2 | dn1.1 |
| ORDERED_GROUP | 26.977889 | 29.563316 | 2.585427 | ordered_group.1 | merge.2 |
| SHUFFLE_FIELD | 27.568285 | 29.567226 | 1.998941 | shuffle_field.2 | ordered_group.1 |
| Write to Client | 27.72517 | 30.014911 | 2.289741 | - | - |
| Over All | 0.0 | 30.014911 | 30.014911 | - | - |
+-----------------------+-----------+-----------+--------------+--------------------+-------------------------------------------------------------------------------------------------------------------+
18 rows in set (0.01 sec)