select_scan:全表扫描。在explain中type会显示为All,原因是查询没有用索引。因为全表扫描一般比较慢,所以应该尽量避免
select_full_join:和select_scan差不多,区别是select_full_join代表的是第二张以及之后的表。explain中的类型也是all,原因是表连接所用的字段上没有索引。它对性能有更为严重的影响,绝对要避免,所以用于连接的字段上一般都要加索引。
select_range:需要从硬盘读表在一段范围内的行。在explain中显示为range,说明使用了索引查询记录在硬盘上的位置
select_range_check:比select_full_join好一点,和select_range差不多。区别是MySQL不能确定它是否能够使用一个范围来做连接,如果可以会使用范围,如果不可以仍会使用全表扫描。在explain中type也是all,但是extra会有range checked for each record(index map)的名。
select_full_range_join:和select_range_check类似。不管mysql可以肯定它能够使用范围查找。这时explain中的类型是range。这也是需要优化的。
sort_scan和sort_range
不管是order by还是group by,主要是三步:
(1) 通过where条件找到记录
(2) 排序
(3) 按照排好的顺序读取记录。
如果第一步是select_scan,那么第3步是sort_scan。如果第一步是select_range,那么第三步是sort_range。但是sort_scan和sort_range功能上没有区别,都是将需要的记录按照顺序读出来,所以性能是一样的。
sort_merge_passes:共两步,MYSQL首先会尝试在内存中做排序,使用的内存大小由系统变量sort_buffer_size决定,如果它的大小不够把所有的记录都读到内存中,MySQL就会把每次在内存中排序的结果存到临时文件中,等MYSQL找到所有记录之后,再把临时文件中的记录做一次排序。这再次排序就会增加sort_merge_passes。实际上,MYSQL会用另一个临时文件来存再次排序的结果,所以通常看到sort_merge_passes增加的数值是见临时文件数的两倍,因为用到了临时文件,所以速度可能会比较慢,增肌sort_buffer_size会减少sort_merge_passes和创建临时文件的次数。但是盲目增加sort_buffer_size不一定提高速度
sort_row:这代表在第二步中有多少记录被排序
网友评论