程序员小天地

TiDB执行计划(二)

2021-12-14  本文已影响0人  小草莓子桑

接一篇TiDB执行计划(一),上一篇中主要介绍了执行计划中涉及到的算子,今天把执行计划中剩余的东西讲完

查询计划命令

EXPLAIN命令,可以查看TiDB执行sql时的执行计划,用法和mysql一样,跟上sql即可

EXPLAIN  SQL语句

举个栗子(脱敏数据)

执行 EXPLAIN

EXPLAIN 
select
  a0_.id,
  a0_.create_time,
  a0_.end_time,
  a0_.flow_id,
  a0_.campaign_id,
  a0_.unit_id,
  a0_.oa_id,
  a0_.org_path_,
  a0_.param,
  a0_.start_time,
  a0_.state,
  a0_.user_type,
  a0_.update_time,
  a0_.user_id
from
  table_a a0_
where
  a0_.campaign_id = 354361236223
  and a0_.user_id = 25325123
  and a0_.user_type = 1
  and a0_.param = '1'
limit
  1000

执行计划结果

执行计划结果

执行计划以一个树形结构展示出来,来说说每一列的含义吧:

上一篇文章说了算子,今天来说下执行计划中,剩下这几个字段estRowstaskaccess-objectoperator info的含义吧

estRows:为每一个子任务预估需要处理的行数
这个很容易理解,就直接上栗子了
select
  user_id
from
  tablea a0_
GROUP by
  user_id

这个sql,对于索引列user_id使用了group by,导致了执行时需要对所有索引数据进行扫描,会出现IndexFullScan算子,执行计划如下:

estRows
task:为子任务执行时候所在的位置
举个栗子

栗子1:聚合查询栗子,使用COUNT

select
  COUNT(user_id)
from
  tablea a0_

这个sql,对于索引列user_id使用了COUNT函数,导致了执行时需要对所有索引数据进行扫描,会出现IndexFullScan算子,执行计划如下:

COUNT函数

栗子2:聚合查询栗子,使用group by

select
  user_id
from
  tablea a0_
GROUP by
  user_id

这个sql,对于索引列user_id使用了group by,导致了执行时需要对所有索引数据进行扫描,会出现IndexFullScan算子,执行计划如下:

group by

栗子3:子查询栗子,使用索引IN 子查询,当子查询为全量时

select
  *
from
  tablea a0_
where
  user_id IN (
    select
      user_id
    from
      tablea
  )

这个sql,对于索引列user_id使用了in,子查询为全表扫描,所以会导致外层查询会对索引列user_id进行全索引数据进行扫描,会出现IndexFullScan算子,执行计划如下:

IN 子查询
access-object: 子任务的对象,比如说表、索引等
这个很容易理解,就直接上栗子了
select
  * 
from
  tablea a1_
where
  a1_.user_id = 123214125

执行计划如下:

TableRowIDScan栗子
operator info: 子任务执行时候的一些算是操作日志的信息
这个很容易理解,基本是每一步的操作日志,就不举栗子说明,从原来的栗子中都可以看的懂

TiDB执行计划中的算子就为大家说到这里,欢迎大家来交流,指出文中一些说错的地方,让我加深认识。

上一篇下一篇

猜你喜欢

热点阅读