MYSQL--Profile分析
今天在分析一條SQL語句的時候,發現在SQL語句的末尾或者最前面加空格,並不影響直接從QC裡面去取結果。
參考手冊裡是這麼說的:
www.2cto.com
查詢必須是完全相同的(逐字節相同)才能夠被認為是相同的。另外,同樣的查詢字符串由於其它原因可能認為是不同的。使用不同的數據庫、不同的協議版本或者不同 默認字符集的查詢被認為是不同的查詢並且分別進行緩存。
既然是要完全相同,那麼如下兩條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) www.2cto.com
而且只是在前後加了空格的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 | www.2cto.com
| 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裡面去比較的。
作者 909413335