天堂

  :: :: 博问 :: 闪存 :: :: :: 订阅 订阅 :: 管理 ::
  76 随笔 :: 0 文章 :: 25 评论 :: 12万 阅读

今天同事在查看一个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   zuoxingyu  阅读(1421)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示