今天同事在查看一个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损耗计算。

 

 

 

相关文章:

  • 2022-01-14
  • 2021-12-06
  • 2022-12-23
  • 2021-05-15
  • 2021-07-12
  • 2021-09-05
  • 2020-02-19
猜你喜欢
  • 2021-06-18
  • 2022-12-23
  • 2021-11-03
  • 2021-09-21
  • 2021-10-21
  • 2021-11-28
  • 2021-07-11
相关资源
相似解决方案