MySQL SQL分析 - 参数化查询vs query cache功能(四)

2014-11-24 15:39:41 · 作者: · 浏览: 2
n set (0.00 sec) mysql> show profile; +--------------------------------+----------+ | Status | Duration | +--------------------------------+----------+ | starting | 0.001367 | | Waiting for query cache lock | 0.000071 | | init | 0.000027 | | checking query cache for query | 0.000163 | | checking privileges on cached | 0.000129 | | checking permissions | 0.000386 | | sending cached result to clien | 0.000164| | cleaning up | 0.000079 | +--------------------------------+----------+ 8 rows in set, 1 warning (0.01 sec)

参考 SQL 分析三,四,数据查询需要使用的时间(绿色标注部分)很明显, SQL 分析四返回速度块了很多,另外,从 系统返回的 SQL 分析看出来,系统直接从缓存中返回数据给客户, 没有重复进行 SQL 分析及磁盘 I/O 操作。(蓝色标注部分) 因此, QEURY CACHE 明显加速了 SQL 返回结果。
但必须注意,只有两个 SQL 相同的情况下,才能够获得 QUERY CACHE 的优点。
参数化查询
参数化查询能够在一定情况下避免了 SQL 注入, 而 ORACLE 也比较推荐使用参数化查询, ORACLE 每次执行 SQL (无论 SQL 是否语法一致)都存在 SQL 分析,
假如SQL语法不一样,则进行硬解析,需要重新定制执行计划
假如SQL语法不一致则进行软解析,避免重复定制执行计划,减少 CPU 消耗,增加 SQL 语句返回时间。
MySQL 官方文档中并没有提出到这点。
对 MySQL 进行参数化查询分析
SQL 参数化分析一
mysql> set @num=11204;
mysql> select tbcrbtnumb0_.id as id41_, tbcrbtnumb0_.business_ring_id as business2_41_, tbcrbtnumb0_.application_no as applicat3_41_, tbcrbtnumb0_.mobile as mobile41_ from tb_crbt_numbers_load tbcrbtnumb0_ where 1=1 and tbcrbtnumb0_.business_ring_id=@num;
+-------+---------------+---------------+-----------+
| id41_ | business2_41_ | applicat3_41_ | mobile41_ |
+-------+---------------+---------------+-----------+
| 31051 |         11204 | 1222570       | 85237810  |
| 31052 |         11204 | 1222570       | 82685386  |
| 31053 |         11204 | 1222570       | 82783689  |
| 31054 |         11204 | 1222570       | 82685106  |
| 31055 |         11204 | 1222570       | 38880051  |
+-------+---------------+---------------+-----------+
5 rows in set (0.37 sec)
mysql>
show profile; +--------------------------------+----------+ | Status | Duration | +--------------------------------+----------+ | starting | 0.001858 | | Waiting for query cache lock | 0.000089 | | init | 0.000150 | | checking query cache for query | 0.001143 | | checking permissions | 0.000970 | | Opening tables | 0.000544 | | init | 0.000743 | | System lock | 0.000170 | | optimizing | 0.000332 | | statistics | 0.000293 | | preparing | 0.000134 | | executing | 0.000057 | | Sending data | 0.438626 | | end | 0.000694 | | query end | 0.000221 | | closing tables | 0.000300 | | freeing items | 0.000521 | | cleaning up | 0.000360 | +--------------------------------+----------+ 18 rows in set, 1 warning (0.01 sec)

变量值不变情况下,重复执行该 SQL 语句
mysql> select tbcrbtnumb0_.id as id41_, tbcrbtnumb0_.business_ring_id as business2_41_, tbcrbtnumb0_.application_no as applicat3_41_, tbcrbtnumb0_.mobile as mobile41_ from tb_crbt_numbers_load tbcrbtnumb0_ where 1=1 and tbcrbtnumb0_.business_ring_id=@num;
+-------+---------------+---------------+-----------+
| id41_ | business2_41_ | applicat3_41_ | mobile41_ |
+-------+---------------+---------------+-----------+
| 31051 |         11204 | 1222570       | 85237810  |
| 31052 |         11204 | 1222570       | 82685386  |
| 31053 |         11204 | 1222570       | 82783689  |
| 31054 |         11204 | 1222570       | 82685106  |
| 31055 |         11204 | 1222570       | 38880051  |
+-------+---------------+---------------+-----------+
5 rows in set (0.34 sec)
mysql> show profile;                                                                                                          +--------------------------------+----------+
| Status                         | Duration |
+--------------------------------+----------+
| starting                       | 0.00