MySQL SQL分析 - 参数化查询vs query cache功能(四)
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