今天在分析一条SQL语句的时候,发现在SQL语句的末尾或者最前面加空格,并不影响直接从QC里面去取结果。
参考手册里是这么说的:
查询必须是完全相同的(逐字节相同)才能够被认为是相同的。另外,同样的查询字符串由于其它原因可能认为是不同的。使用不同的数据库、不同的协议版本或者不同
默认字符集的查询被认为是不同的查询并且分别进行缓存。
既然是要完全相同,那么如下两条SQL应该是不同的
- select count(*) from t1 ;
- select count(*) from t1 ;
但是在实际运行时,确的当作相同的SQL来执行的
- mysql> SHOW PROFILES;
-
+----------+------------+-----------------------------+
-
| Query_ID | Duration | Query |
-
+----------+------------+-----------------------------+
-
| 1 | 0.00006925 | select count(*) from t1 |
-
| 2 | 0.08126275 | insert into t1 values(6) |
-
| 3 | 0.00043675 | select count(*) from t1 |
-
| 4 | 0.00006850 | select count(*) from t1 |
-
| 5 | 0.00021075 | select count(*) from t1 |
-
| 6 | 0.00007150 | select count(*) from t1 |
-
| 7 | 0.00007300 | select count(*) from t1 |
-
| 8 | 0.00020975 | select count(*) from t1 |
-
+----------+------------+-----------------------------+
-
8 rows in set (0.00 sec)
而且只是在前后加了空格的SQL语句,就直接从QC里面获取数据了,不再进行优化,执行等操作。
- mysql> SHOW PROFILE FOR QUERY 7;
-
+--------------------------------+----------+
-
| Status | Duration |
-
+--------------------------------+----------+
-
| starting | 0.000022 |
-
| checking query cache for query | 0.000007 |
-
| checking privileges on cached | 0.000005 |
-
| sending cached result to clien | 0.000034 |
-
| logging slow query | 0.000003 |
-
| cleaning up | 0.000003 |
-
+--------------------------------+----------+
-
6 rows in set (0.00 sec)
在SQL的中间插入空格,才会当作不同的SQL来运行。
- mysql> SHOW PROFILE FOR QUERY 8;
-
+--------------------------------+----------+
-
| Status | Duration |
-
+--------------------------------+----------+
-
| starting | 0.000023 |
-
| checking query cache for query | 0.000049 |
-
| Opening tables | 0.000013 |
-
| System lock | 0.000005 |
-
| Table lock | 0.000037 |
-
| init | 0.000012 |
-
| optimizing | 0.000006 |
-
| executing | 0.000012 |
-
| end | 0.000004 |
-
| query end | 0.000003 |
-
| freeing items | 0.000036 |
-
| storing result in query cache | 0.000006 |
-
| logging slow query | 0.000003 |
-
| cleaning up | 0.000002 |
-
+--------------------------------+----------+
-
14 rows in set (0.00 sec)
从上面可以得到,QC在存储SQL语句的时候,是去掉了头尾的空格的。而且在查询时,也自动去掉首尾的空格,再到QC里面去比较的。
阅读(834) | 评论(0) | 转发(0) |