我们在使用SQL语句查询表数据时,提前使用explain进行语句分析是一个非常好的习惯。通过explain输出sql的详细执行信息,可以针对性的优化sql。今天我们就来分析一下explain中11种不同类型的含义和应用场景。1、系统应用场景:表中只有一条数据,存储引擎可以准确统计这条数据。系统一般出现在MyISAM和内存表查询中。由于我们一般使用的存储引擎是InnoDB,所以这种系统很少用到。2.const应用场景:通过主键或者唯一索引等值查询定位到一条数据。例如:select*fromtestwhereid=1。我们知道MySQL底层使用B+树来存储数据。它的结构可以大致类似于下图。然后我们在m字段上创建唯一索引约束。如果我们要找到m=103的记录,只需要简单的两步,通过二分法定位到m=103。即100->102->103。即使是真实的有很多记录的业务表,由于B+树的chunky结构,在唯一索引中定位一条记录的速度也是非常快的。可以大致认为查询速度是恒定的。因此,MySQL将这种唯一索引或主键(主键也是唯一索引)等价匹配查询定义为const(常量级别)。需要注意的是,由于唯一索引中允许有多个空值,如果对唯一索引进行空值查询,则不能使用const。3、eq_ref的应用场景:在进行多表连接查询时,被驱动表通过主键或唯一索引键进行等值查询。例如:SELECT*FROMt1LEFTJOINt2ONt1.id=t2.id。4、ref的应用场景:普通二级索引等值查询。例如:select*fromt2wherekey2=4。除了唯一索引,我们还会使用更常见的二级索引。由于二级索引,可能会查询到多个匹配值,比const性能差一点。MySQL将这种类型的查询定义为ref。上面我们提到,由于唯一索引中可能存在多个null,所以不能使用const。对于select*fromt2wherekey2为null,不管是唯一索引还是普通索引,最多使用ref的类型。5.ref_or_null应用场景:命中索引时,查询条件除了等价查询外,还包括空值查询。例如:select*fromt2wherekey2=4orkey2isnull。其实看名字就很容易理解。MySQL会在B+树上找到key2=1和key2为null这两条记录范围值,然后得到主键id返回表中查询相关信息。6、index_merge应用场景:查询条件可以命中多个索引。例如:select*fromt3wherekey1=3orkey2=4。索引合并其实很容易理解。当查询条件可以命中多个索引时,MySQL会尝试在两个索引树中寻找匹配条件,然后将结果合并。7、unique_subquery应用场景:查询条件包含子查询,子查询的列可以与主键等价匹配。例如:SELECT*FROMt2WHEREt2.key2IN(SELECTidFROMt3WHEREt2.key2=t3.key2)ORt2.key2=1。通过查看MySQL优化执行SQL,可以看到MySQL优化了in子查询进入存在语句,并在主键索引上执行等效查询。MySQL优化语句:/*select#1*/select`dbs`.`t2`.`id`AS`id`,`dbs`.`t2`.`key2`AS`key2`from`dbs`。`t2`where(
