《纯干货:Mysql性能优化Explain分析》要点:
本文介绍了纯干货:Mysql性能优化Explain分析,希望对您有用。如果有疑问,可以联系我们。
MySQL 提供了一个 EXPLAIN 命令, 它可以对 SELECT 语句进行分析, 并输出 SELECT 执行的详细信息, 以供开发人员针对性优化
EXPLAIN 用法:
EXPLAIN SELECT * FROM test WHERE id = 100;
id
SELECT 查询的标识符. 每个 SELECT 都会自动分配一个唯一的标识符.
select_type
SELECT 查询的类型.
table
查询的是哪个表
type
join 类型
possible_keys
此次查询中可能选用的索引
key
此次查询中确切使用到的索引.
ref
哪个字段或常数与 key 一起被使用
rows
显示此查询一共扫描了多少行. 这个是一个估计值.
extra
其他信息
SIMPLE
简单的 select 查询,不使用 union 及子查询
PRIMARY
最外层的 select 查询
UNION
UNION 中的第二个或随后的 select 查询,不 依赖于外部查询的结果集
DEPENDENT UNION
UNION 中的第二个或随后的 select 查询,依 赖于外部查询的结果集
SUBQUERY
子查询中的第一个 select 查询,不依赖于外 部查询的结果集
DEPENDENT SUBQUERY
子查询中的第一个 select 查询,依赖于外部 查询的结果集
DERIVED
用于 from 子句里有子查询的情况. MySQL 会 递归执行这些子查询, 把结果放在临时表里.
UNCACHEABLE SUBQUERY
结果集不能被缓存的子查询,必须重新为外 层查询的每一行进行评估.
UNCACHEABLE UNION
UNION 中的第二个或随后的 select 查询,属 于不可缓存的子查询
system
表仅有一行(=系统表).这是 const 连接类型的一个特例.
constconst
用于用常数值比较 PRIMARY KEY 时.当 查询的表仅有一行时,使用 System.
eq_refconst
用于用常数值比较 PRIMARY KEY 时.当 查询的表仅有一行时,使用 System.
ref
连接不能基于关键字选择单个行,可能查找 到多个符合条件的行. 叫做 ref 是因为索引要 跟某个参考值相比较.这个参考值或者是一 个常数,或者是来自一个表里的多表查询的 结果值.
ref_or_null
如同 ref, 但是 MySQL 必须在初次查找的结果 里找出 null 条目,然后进行二次查找.
index_merge
说明索引合并优化被使用了.
unique_subquery
在某些 IN 查询中使用此种类型,而不是常规的 ref:value IN (SELECT primary_key FROM single_table WHERE some_expr)
index_subquery
在 某 些 IN 查 询 中 使 用 此 种 类 型 , 与 unique_subquery 类似,但是查询的是非唯一 性索引: value IN (SELECT key_column FROM single_table WHERE some_expr)
range
只检索给定范围的行,使用一个索引来选择 行.key 列显示使用了哪个索引.当使用=、 <>、>、>=、<、<=、IS NULL、<=>、BETWEEN 或者 IN 操作符,用常量比较关键字列时,可 以使用 range.
index
全表扫描,只是扫描表的时候依照索引次序 进行而不是行.主要优点就是避免了排序, 但是开销仍然非常大.
all
最坏的情况,从头到尾全表扫描.
type 类型的性能关系如下:
ALL < index < range ~ index_merge < ref < eq_ref < const < system
在使用过程中,经常关注的是 type 和 Extra,主要为了判断执行的sql语句是否使用到了索引或者是否是全表扫描等等!
以上仅仅是列出了很简单的一些理论知识和简单的sql语句分析,详细的还需要各位多多查阅资料!总之:
MySql 中的 explain 语法可以赞助我们改写查询,优化表的结构和索引的设置,从而最大地提高查询效率.
欢迎参与《纯干货:Mysql性能优化Explain分析》讨论,分享您的想法,维易PHP学院为您提供专业教程。
转载请注明本页网址:
http://www.vephp.com/jiaocheng/8014.html