执行计划级别
const
如果一个SQL执行的时候,完全使用上索引,聚簇索引或者二级索引+回表。那么这种查找数据的过程,在执行计划里面称为const,意思是常量级别的,超级快的。
但是二级索引必须是uniqu的,必须是唯一的,才会是const。
ref
如果二级索引是普通索引,不是唯一索引的话,那么这个级别叫做ref。如果条件包含多个索引,只有从最左侧开始连续多个列都是等值比较才属于ref。 如果条件里面有 “字段名 is NULL”这样的条件 例如: name = 'aa' or name is null,那么在执行计划里面会叫做 ref_or_null。 意思是
range
使用索引进行范围查找的时候,就会是这个级别。 因为也使用了索引,所以速度不会太差。
index
只需要遍历二级索引就能获取到需要的数据,不需要进行回表。这样的方式称为index级别。意思是,我们查询需要的字段能在二级索引里面全部找到,但是又不符合索引的最左匹配规则,只能对二级索引的叶子结点进行遍历。但是不需要回表,而且也比直接去遍历聚簇索引要快得多,因为字段比较少,数据比较小。
all
全表扫描,对聚簇索引的叶子结点进行全表扫描。性能级差。
单表查询,用到多个索引的时候, 查询的步骤会有几种可能:
-
使用1个索引筛选出数据,然后回表获取完整的数据,再根据第二个条件进行筛选。 具体先使用哪个索引,由MySql进行选择,会选择扫描数据比较少的索引。
-
使用2个索引分别筛选出数据, 然后取并集,或者交集。 然后再去回表。
多表查询
多表查询的时候,一般都会使用连表,步骤是,先根据条件从表1筛选出数据, 然后用第1条数据的关联字段作为条件,去表2里面找数据,找到数据后就关联起来。 然后用表1的第2条数据的关联字段去表2里面筛选数据。
这种查询的方式,叫做嵌套循环关联, 像是我们写代码的时候里面的多重嵌套循环,所以关联查询一般很慢,多张表关联起来就更加慢了。
要尽量保证在筛选的数据的时候使用上索引,这样关联查询起来也会快很多些。
网友评论