15.2 优化查询
15.2.1 分析查询语句
通过对查询语句的分析,可以了解查询语句的执行情况,MySQL中提供了EXPLAIN和DESCRIBE语句用来分析查询语句
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对于每个来自前面的表的行组合,从该表中读取一行,当一个索引的所有部分都在查询中使用并且索引是UNIQUE或PRIMARY 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 使用索引查询
一下查询,索引是不一定起作用的!!!
使用
LIKE关键字的查询语句匹配查询
'%内容'是不起作用的,即%在开始,不起作用使用多列索引的查询语句
一个索引可以包含多个字段,对于多列索引,只有查询条件中使用了这些字段的第一个字段时,索引才会被使用
使用
OR关键字的查询语句查询条件只有
OR关键字,并且OR前后两个列都是索引,查询中索引才会生效
15.2.4 优化子查询
MySQL中,可以使用连接(JOIN语句)查询来代替子查询
最后更新于
这有帮助吗?