所在的位置: mysql >> mysql市场 >> MySQL执行计划详解

MySQL执行计划详解

公益中国援助定点白癜风医院 https://m.39.net/disease/a_5496912.html
1.EXPLAIN详解

本文基于MySQL8.0编写,理论支持MySQL5.0及更高版本。

2.EXPLAIN使用2.1xplain分析SQL的执行计划

{EXPLAIN

DESCRIBE

DESC}tbl_nam[col_nam

wild]{EXPLAIN

DESCRIBE

DESC}[xplain_typ]{xplainabl_stmt

FORCONNECTIONconnction_id}{EXPLAIN

DESCRIBE

DESC}ANALYZEslct_statmntxplain_typ:{FORMAT=format_nam}format_nam:{TRADITIONAL

JSON

TREE}xplainabl_stmt:{SELECTstatmnt

TABLEstatmnt

DELETEstatmnt

INSERTstatmnt

REPLACEstatmnt

UPDATEstatmnt}

2.2示例

EXPLAINformat=TRADITIONALjsonSELECTtt.TicktNumbr,tt.TimIn,tt.ProjctRfnc,tt.EstimatdShipDat,tt.ActualShipDat,tt.ClintID,tt.SrvicCods,tt.RptitivID,tt.CurntProcss,tt.CurntDPPrson,tt.RcordVolum,tt.DPPrintd,t.COUNTRY,t_1.COUNTRY,do.CUSTNAMEFROMtt,t,tASt_1,doWHEREtt.SubmitTimISNULLANDtt.ActualPC=t.EMPLOYIDANDtt.AssigndPC=t_1.EMPLOYIDANDtt.ClintID=do.CUSTNMBR;

2.3结果输出展示3.结果解读id:该语句的唯一标识。如果xplain的结果包括多个id值,则数字越大越先执行;而对于相同id的行,则表示从上往下依次执行。slct_typ:查询类型,有如下几种取值:??tabl:表示当前这一行正在访问哪张表,如果SQL定义了别名,则展示表的别名partitions:当前查询匹配记录的分区。对于未分区的表,返回nulltyp:连接类型,有如下几种取值,性能从好到坏排序如下:

?systm:该表只有一行(相当于系统表),systm是const类型的特例

?const:针对主键或唯一索引的等值查询扫描,最多只返回一行数据.const查询速度非常快,因为它仅仅读取一次即可

?q_f:当使用了索引的全部组成部分,并且索引是PRIMARYKEY或UNIQUENOTNULL才会使用该类型,性能仅次于systm及const。

--多表关联查询,单行匹配SELECT*FROMf_tabl,othr_tablWHEREf_tabl.ky_column=othr_tabl.column;--多表关联查询,联合索引,多行匹配SELECT*FROMf_tabl,othr_tablWHEREf_tabl.ky_column_part1=othr_tabl.columnANDf_tabl.ky_column_part2=1;

?f:当满足索引的最左前缀规则,或者索引不是主键也不是唯一索引时才会发生。如果使用的索引只会匹配到少量的行,性能也是不错的。

--根据索引(非主键,非唯一索引),匹配到多行SELECT*FROMf_tablWHEREky_column=xpr;--多表关联查询,单个索引,多行匹配SELECT*FROMf_tabl,othr_tablWHEREf_tabl.ky_column=othr_tabl.column;--多表关联查询,联合索引,多行匹配SELECT*FROMf_tabl,othr_tablWHEREf_tabl.ky_column_part1=othr_tabl.columnANDf_tabl.ky_column_part2=1;

TIPS最左前缀原则

指的是索引按照最左优先的方式匹配索引。比如创建了一个组合索引(column1,column2,column3),那么,如果查询条件是:WHEREcolumn1=1、WHEREcolumn1=1ANDcolumn2=2、WHEREcolumn1=1ANDcolumn2=2ANDcolumn3=3都可以使用该索引;WHEREcolumn1=2、WHEREcolumn1=1ANDcolumn3=3就无法匹配该索引。

?fulltxt:全文索引f_or_null:该类型类似于f,但是MySQL会额外搜索哪些行包含了NULL。这种类型常见于解析子查询

SELECT*FROMf_tablWHEREky_column=xprORky_columnISNULL;

?indx_mrg:此类型表示使用了索引合并优化,表示一个查询里面用到了多个索引

?uniqu_subqury:该类型和q_f类似,但是使用了IN查询,且子查询是主键或者唯一索引。例如:valuIN(SELECTprimary_kyFROMsingl_tablWHEREsom_xpr)

?indx_subqury:和uniqu_subqury类似,只是子查询使用的是非唯一索引。valuIN(SELECTky_columnFROMsingl_tablWHEREsom_xpr)

?rang:范围扫描,表示检索了指定范围的行,主要用于有限制的索引扫描。比较常见的范围扫描是带有BETWEEN子句或WHERE子句里有、=、、=、ISNULL、=、BETWEEN、LIKE、IN()等操作符。

SELECT*FROMtbl_namWHEREky_columnBETWEEN10and20;SELECT*FROMtbl_namWHEREky_columnIN(10,20,30);

?indx:全索引扫描,和ALL类似,只不过indx是全盘扫描了索引的数据。当查询仅使用索引中的一部分列时,可使用此类型。有两种场景会触发:

?如果索引是查询的覆盖索引,并且索引查询的数据就可以满足查询中所需的所有数据,则只扫描索引树。此时,xplain的Extra列的结果是Usingindx。indx通常比ALL快,因为索引的大小通常小于表数据。

?按索引的顺序来查找数据行,执行了全表扫描。此时,xplain的Extra列的结果不会出现Ussindx。

?ALL:全表扫描,性能最差。

possibl_kys:展示当前查询可以使用哪些索引,这一列的数据是在优化过程的早期创建的,因此有些索引可能对于后续优化过程是没用的。ky:表示MySQL实际选择的索引ky_ln:索引使用的字节数。由于存储格式,当字段允许为NULL时,ky_ln比不允许为空时大1字节。

?ky_ln计算公式:


转载请注明:http://www.aierlanlan.com/rzdk/8009.html