Chinaunix首页 | 论坛 | 博客
  • 博客访问: 490128
  • 博文数量: 99
  • 博客积分: 3621
  • 博客等级: 中校
  • 技术积分: 1089
  • 用 户 组: 普通用户
  • 注册时间: 2010-06-22 16:29
文章存档

2012年(21)

2011年(28)

2010年(50)

分类: Mysql/postgreSQL

2011-05-04 13:55:54

今天在分析一条SQL语句的时候,发现在SQL语句的末尾或者最前面加空格,并不影响直接从QC里面去取结果。
参考手册里是这么说的:

查询必须是完全相同的(逐字节相同)才能够被认为是相同的。另外,同样的查询字符串由于其它原因可能认为是不同的。使用不同的数据库、不同的协议版本或者不同 默认字符集的查询被认为是不同的查询并且分别进行缓存。

既然是要完全相同,那么如下两条SQL应该是不同的


  1. select count(*) from t1         ;
  1. select count(*) from t1 ;
但是在实际运行时,确的当作相同的SQL来执行的
  1. mysql> SHOW PROFILES;
  2. +----------+------------+-----------------------------+
  3. | Query_ID | Duration | Query |
  4. +----------+------------+-----------------------------+
  5. | 1 | 0.00006925 | select count(*) from t1 |
  6. | 2 | 0.08126275 | insert into t1 values(6) |
  7. | 3 | 0.00043675 | select count(*) from t1 |
  8. | 4 | 0.00006850 | select count(*) from t1 |
  9. | 5 | 0.00021075 | select count(*) from   t1 |
  10. | 6 | 0.00007150 | select count(*) from   t1 |
  11. | 7 | 0.00007300 | select count(*) from t1 |
  12. | 8 | 0.00020975 | select        count(*) from t1 |
  13. +----------+------------+-----------------------------+
  14. 8 rows in set (0.00 sec)
而且只是在前后加了空格的SQL语句,就直接从QC里面获取数据了,不再进行优化,执行等操作。
  1. mysql> SHOW PROFILE FOR QUERY 7;
  2. +--------------------------------+----------+
  3. | Status | Duration |
  4. +--------------------------------+----------+
  5. | starting | 0.000022 |
  6. | checking query cache for query | 0.000007 |
  7. | checking privileges on cached | 0.000005 |
  8. | sending cached result to clien | 0.000034 |
  9. | logging slow query | 0.000003 |
  10. | cleaning up | 0.000003 |
  11. +--------------------------------+----------+
  12. 6 rows in set (0.00 sec)
在SQL的中间插入空格,才会当作不同的SQL来运行。

  1. mysql> SHOW PROFILE FOR QUERY 8;
  2. +--------------------------------+----------+
  3. | Status | Duration |
  4. +--------------------------------+----------+
  5. | starting | 0.000023 |
  6. | checking query cache for query | 0.000049 |
  7. | Opening tables | 0.000013 |
  8. | System lock | 0.000005 |
  9. | Table lock | 0.000037 |
  10. | init | 0.000012 |
  11. | optimizing | 0.000006 |
  12. | executing | 0.000012 |
  13. | end | 0.000004 |
  14. | query end | 0.000003 |
  15. | freeing items | 0.000036 |
  16. | storing result in query cache | 0.000006 |
  17. | logging slow query | 0.000003 |
  18. | cleaning up | 0.000002 |
  19. +--------------------------------+----------+
  20. 14 rows in set (0.00 sec)

从上面可以得到,QC在存储SQL语句的时候,是去掉了头尾的空格的。而且在查询时,也自动去掉首尾的空格,再到QC里面去比较的。











阅读(834) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~