SQL调优1.0
sql调优是需要时间积累的,这里只是记录一些基础的知识,也是我第一篇sql调优
一般情况下sql调优主要依靠explain命令:expain出来的信息有10列,分别是id、select_type、table、type、possible_keys、key、key_len、ref、rows、Extra:
每个字段的含义
-
id:选择标识符(比较重要)
这是SELECT的查询序列号。id越大,查询优先级越高。如果id一样,从上往下执行。 -
select_type:表示查询的类型。(不重要)
(1) SIMPLE(简单SELECT,不使用UNION或子查询等)
(2) PRIMARY(子查询中最外层查询,查询中若包含任何复杂的子部分,最外层的select被标记为PRIMARY)
(3) UNION(UNION中的第二个或后面的SELECT语句)
(4) DEPENDENT UNION(UNION中的第二个或后面的SELECT语句,取决于外面的查询)
(5) UNION RESULT(UNION的结果,union语句中第二个select开始后面所有select)
(6) SUBQUERY(子查询中的第一个SELECT,结果不依赖于外部查询)
(7) DEPENDENT SUBQUERY(子查询中的第一个SELECT,依赖于外部查询)
(8) DERIVED(派生表的SELECT, FROM子句的子查询)
(9) UNCACHEABLE SUBQUERY(一个子查询的结果不能被缓存,必须重新评估外链接的第一行) -
table:输出结果集的表
显示这一步所访问数据库中表名称 -
type:表示表的连接类型(最重要)
ALL、index、range、 ref、eq_ref、const、system、NULL(从左到右,性能从差到好)进行调优的时候最好能够达到ref,range也能接受。 -
possible_keys:表示查询时,可能使用的索引
指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用(该查询可以利用的索引,如果没有任何索引显示 null) -
key:表示实际使用的索引
key列显示MySQL实际决定使用的键(索引),必然包含在possible_keys中 -
key_len:索引字段的长度
表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度(key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的) -
ref:列与索引的比较
列与索引的比较,表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值 -
rows:扫描出的行数(估算的行数)
估算出结果集行数,表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数 -
Extra:执行情况的描述和说明
然后我们需要知道sql一般的解析过程: