天堂

  :: :: 博问 :: 闪存 :: :: :: 订阅 订阅 :: 管理 ::

今天同事在查看一个SQL的执行计划的时候,EXPLAIN语句跑了2分钟。SQL命令类似:

1 SELECT * FROM (SELECT USERID,COUNT(*) FROM TBNAME GROUP BY USERID) A INNER JOIN B ON A.USERID=B.USERID;


MYSQL在确定这个SQL的执行计划时,需要先计算出字表A的记录数,然后才能确定最后的执行计划。为了验证这个结论,测试下面的例子。

mysql> explain select sleep(10)\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: NULL
         type: NULL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: NULL
        Extra: No tables used
1 row in set (0.00 sec)

很快就出来了。换个子查询。
可以看到执行时间10S,就是SLEEP的时间。

mysql> explain select * from (select sleep(10)) A\G
*************************** 1. row ***************************
           id: 1
  select_type: PRIMARY
        table: <derived2>
         type: system
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 1
        Extra:
*************************** 2. row ***************************
           id: 2
  select_type: DERIVED
        table: NULL
         type: NULL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: NULL
        Extra: No tables used
2 rows in set (10.00 sec)

 

结论:EXPLAIN的时候,对于子查询,优化器会先去执行子查询,得到准确的结果后,再把这个结果集作为条件并入COST损耗计算。

 

 

 

posted on 2013-09-09 16:49  zuoxingyu  阅读(1387)  评论(0编辑  收藏  举报