执行计划,SQL是怎么执行的

执行计划级别

const

如果一个SQL执行的时候,完全使用上索引,聚簇索引或者二级索引+回表。那么这种查找数据的过程,在执行计划里面称为const,意思是常量级别的,超级快的。

但是二级索引必须是uniqu的,必须是唯一的,才会是const。

ref

如果二级索引是普通索引,不是唯一索引的话,那么这个级别叫做ref。如果条件包含多个索引,只有从最左侧开始连续多个列都是等值比较才属于ref。 如果条件里面有 “字段名 is NULL”这样的条件 例如: name = 'aa' or name is null,那么在执行计划里面会叫做 ref_or_null。 意思是

range

使用索引进行范围查找的时候,就会是这个级别。 因为也使用了索引,所以速度不会太差。

index

只需要遍历二级索引就能获取到需要的数据,不需要进行回表。这样的方式称为index级别。意思是,我们查询需要的字段能在二级索引里面全部找到,但是又不符合索引的最左匹配规则,只能对二级索引的叶子结点进行遍历。但是不需要回表,而且也比直接去遍历聚簇索引要快得多,因为字段比较少,数据比较小。

all

全表扫描,对聚簇索引的叶子结点进行全表扫描。性能级差。

单表查询,用到多个索引的时候, 查询的步骤会有几种可能:

  1. 使用1个索引筛选出数据,然后回表获取完整的数据,再根据第二个条件进行筛选。 具体先使用哪个索引,由MySql进行选择,会选择扫描数据比较少的索引。

  2. 使用2个索引分别筛选出数据, 然后取并集,或者交集。 然后再去回表。

多表查询
多表查询的时候,一般都会使用连表,步骤是,先根据条件从表1筛选出数据, 然后用第1条数据的关联字段作为条件,去表2里面找数据,找到数据后就关联起来。 然后用表1的第2条数据的关联字段去表2里面筛选数据。

这种查询的方式,叫做嵌套循环关联, 像是我们写代码的时候里面的多重嵌套循环,所以关联查询一般很慢,多张表关联起来就更加慢了。

要尽量保证在筛选的数据的时候使用上索引,这样关联查询起来也会快很多些。

你可能感兴趣的:(执行计划,SQL是怎么执行的)