OneProxy :: 如何知道一个事务是由哪几个SQL构成的?只有通过阅读应用程序代码吗?

当面对一个陌生应用(比如采购外部系统,或者你跳槽到新的公司)或者面对一个老应用(原开发人员已经转岗多次)时,面临的最大问题是如何快速熟悉系统,虽然在公司内部研发的系统,也未必找得到现成的人来问个清楚。比如2008年去支付宝时,直接面对一个有上千个表的用户,上面几十个应用在同时访问,搞清楚它才能制定出切实可行的策略。为了帮助大家理解应用,已经在OneProxy中提供了分析事务所涉及的表的功能,后来有用户提出能记录一个事务是由多少个SQL组成的,将会更加有利于了解应用程序。

在最新的OneProxy 5.8.3版本中已经有这个功能了,比如我们通过OneProxy执行如下事务:

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> select count(*) from t_test;
+----------+
| count(*) |
+----------+
|   100000 |
+----------+
1 row in set (0.01 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

接下来使用“autocommit”开关来执行另一个事务:

mysql> set autocommit=0;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from t_split;
+-------------+------+
| col1        | id   |
+-------------+------+
| From Master |    1 |
| row2        |    2 |
| row2        |    3 |
+-------------+------+
3 rows in set (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> set autocommit=1;
Query OK, 0 rows affected (0.00 sec)

接下来在管理端口就可以查到事务了,使用“list trans_sqldebug”命令:

mysql> list trans_sqldebug;
+------------+------+
| SQLMAP     | EXEC |
+------------+------+
| 2747735807 |    1 |
| 933207122  |    1 |
+------------+------+
2 rows in set (0.00 sec)

在OneProxy内置的HTTP服务器上查看时,会显示出相关的SQL语句,比在管理端口更加直观。

oneproxy_trans_sqldebug

这样就不需要去查看应用代码,而得到事务的结构,再根据其执行频率做出合理的应用优化建议。