15.2 优化查询

15.2.1 分析查询语句

通过对查询语句的分析,可以了解查询语句的执行情况,MySQL中提供了EXPLAINDESCRIBE语句用来分析查询语句

EXPLAIN语句的基本语法

EXPLAIN [EXTENDED] SELECT select_options

备注:select_options是sql语句的查询选项

对查询结果的解释

id:select标识符,这里是select查询的序号

select_type:表示select语句类型,有以下取值

SIMPLE表示简单查询,不包括连接查询和子查询

PRIMARY表示主查询,或者是最外层的查询语句

UNION表示连接查询的第二个或后面的查询语句

DEPENDENT UNION连接查询中的第二个或后面的select语句,取决于外面的查询

UNION RESULT连接查询的结果

SUBQUERY子查询中的第一个SELECT语句

DEPENDENT SUBQUERY 子查询中的第一个SELECT语句,取决于外面的查询

DERIVED导出表的SELECT(FROM子句的子查询)

table:表示查询的表

type:表示表的连接类型

system该表是仅有一行的系统表

const数据表最多只有一个匹配行,它将在查询开始时候被读取,并在余下查询优化中作为常量对待

eq_ref对于每个来自前面的表的行组合,从该表中读取一行,当一个索引的所有部分都在查询中使用并且索引是UNIQUEPRIMARY KEY时,即可使用该类型

ref对于来自前面的z的表的任意组合,将星该表中读取所有的匹配行,这种类型用于索引既不是UNIQUE也不是PRIMARY KEY的情况,或查询中使用了索引列的左子集,即索引中左边的部分列组合

ref_or_null该连接如同ref,但是添加了可以专门搜索包含NULL值的行,在解决子查询时中经常使用该链接类型的优化

index_merge该链接类型表示使用了索引合并优化方法。在这种情况下,key列包含了使用的索引的清单,key_len包含了使用了索引的最长的关键元素

unique_subquery替换了IN子查询的ref,它是一个索引查找函数,可以完全替换子查询,效率更高

index_subquery该链接类型类似于unique_subquery,可以替换IN子查询,但适用于子查询中的非唯一索引

range只检索给定范围的行,适用一个索引来选择行,key列显示使用了那个索引,ken_len包含所使用索引的最长关键元素,当使用=、<>、>、>=、<、<=、IS NULL、<=>、BETWEEN或者IN操作,用常量比较关键字时,类型为range

index该链接类型与ALL相同,除了只扫描索引树

ALL对于前面的表的任意行组合,进行完整的表扫描。

possible_keys:指出MySQL能使用哪个索引在表中找到该行,如果列是NULL,则没有相关的索引

key:表示查询实际使用到的索引,如果没有索引,该列的值是NULL

key_len:表示MySQL选择的索引字段按字节计算的长度,如果键是NULL,则长度为NULL

ref:表示使用哪个列或常数与索引一起来查询记录

rows:显示MySQL在表中进行查询必须检查的行数

Extra表示MySQL在处理查询时的详细信息

DESCRIBE语句的使用方法与EXPLAIN相同,分析结果也是相同,语法:

备注:DESCRIBE可以缩写成DESC

15.2.2 索引对查询速度的影响

合理的索引,可以加快查询的速度,没有索引,需要首先查全表

15.2.3 使用索引查询

一下查询,索引是不一定起作用的!!!

  1. 使用LIKE关键字的查询语句

    匹配查询'%内容'是不起作用的,即%在开始,不起作用

  2. 使用多列索引的查询语句

    一个索引可以包含多个字段,对于多列索引,只有查询条件中使用了这些字段的第一个字段时,索引才会被使用

  3. 使用OR关键字的查询语句

    查询条件只有OR关键字,并且OR前后两个列都是索引,查询中索引才会生效

15.2.4 优化子查询

MySQL中,可以使用连接(JOIN语句)查询来代替子查询

最后更新于

这有帮助吗?