sql执行计划:
id 用来看查询了几次,或者有几个select。但是这个不一定准确,因为
select * from a inner join b on a.id=b.id;
这个语句有一个select,但是实际上查询了两个表。因此还是要看查询了几张表(包括衍生表)
type: 这个字段用来描述本次查询的性能高低,
all 性能最低(全表扫描),
index,从索引里面取数据,性能仅仅比全表快一点而已,这个也算是用到索引了。但是用到索引并不一定效率高,因为index仅仅代表从索引里面取数据,并没有利用到索引的最大优势,就是通过排序降低io次数。
range,使用到了索引,但是这个代表索引的范围查询。性能比前两个肯定高,因为前两个全表全索引没有用到排序定位,这个用到了排序定位,至少能过滤掉更多数据。select * from A where c1=1 c2>2; 这个sql,首先找到c1=1 c2=2的值,然后在叶子节点处向右查找数据。或者如果这个索引里面还有c3 c4的话,那么此时c1=1 c2=2并没有定位到叶子节点处,但是没关系,你已经通过这两个字段过滤掉大部分数据了,后面只需要在过滤以后的数据里面全部取出就可以了。
ref,这个是说通过索引取出的值可能不只一个。什么情况下通过索引的值不只一个?当然是非唯一索引,或者联合索引的前缀部分。
这个地方有一个细节,通过非唯一索引或联合索引的前缀取出的数据,如果只有一条,也是ref。mysql不管你取出多少数据,只有是你有可能取出多条,就是ref。
eq_ref,通过唯一索引取出数据,唯一索引那取出的肯定是唯一的数据了。另外通过联合索引的全部字段取出的值不一定是这个级别,因为联合索引可能不是唯一索引。除非你先定联合索引是唯一的,那么才是这个级别。
const,通过唯一索引取出的值,并且索引于常数比较,切记是于常数比较。两个条件,一个是唯一索引,一个是常数。
system,表里面只有一条记录,这个基本达不到。
explain执行计划
最新推荐文章于 2024-10-20 21:06:05 发布