今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显。关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情。当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能。这里,我们不会讲过多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库
1.explain(查看执行计划):使用Explain关键字可以模拟优化器执行SQL查询语句,从而知道MySql是如何处理你的SQL语句的,分析你的查询语句或是表结构的性能瓶颈。
(1.)能干嘛?
(2.)怎么玩
1.Explain+SQL语句
2.执行计划包含的信息
2.各名词解释
(1)id
一.第一种情况
二.第二种情况
三.第三种情况
(2).select_type
一.有哪些
simple: 简单的select查询,查询中不包括子查询或者union
primary: 查询中若包含任何复杂的子部分,最外层查询则被标记为
subQuery: 在select或where列表中包括子查询
derived: 在from列表中包括的子查询被标记为derived。mysql会递归执行这些子查询,把结果放在临时表里。
union: 若第二个select出现在union之后,则被标记为union。若union包含在from子句的子查询中,外层select将被标记为derived
union result: 从union表中获取的结果select。
查询的类型,主要用于区别普通查询,联合查询,子查询等的复杂查询
(3).type:访问数据类型
一.有哪些值
从最好到最差依次是:
System>const>eq_ref>ref>range>index>All
一般来说,的保证查询至少达到range级别,最好能达到ref
type类型 | 说明 |
All | 最坏的情况,从头到尾全表扫描 |
index | 和全表扫描一样。只是扫描表的时候按照索引次序进行而不是行。主要优点就是避免了排序, 但是开销仍然非常大。如在Extra列看到Using index,说明正在使用覆盖索引,只扫描索引的数据,它比按索引次序全表扫描的开销要小很多 |
range | 范围扫描,一个有限制的索引扫描。key 列显示使用了哪个索引。当使用=、 <>、>、>=、<、<=、IS NULL、<=>、BETWEEN 或者 IN 操作符,用常量比较关键字列时,可以使用 range |
ref | 一种索引访问,它返回所有匹配某个单个值的行。此类索引访问只有当使用非唯一性索引或唯一性索引非唯一性前缀时才会发生 |
eq_ref | 最多只返回一条符合条件的记录。使用唯一性索引或主键查找时会发生 (高效) |
const/system | 当主键放入where子句时,mysql把这个查询转为一个常量(高效) |
null | 意味说mysql能在优化阶段分解查询语句,在执行阶段甚至用不到访问表或索引(高效) |
(4)possible_key
一:显示可能应用在这张表中的索引,,一个或多个,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询实际使用
(5)key
一.实际使用的索引,如果为null,则没有使用索引
二.查询中若使用了覆盖索引,则该索引仅出现在key列表中
(6)key_len
一.表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度,在不损失精度的情况下,长度越短越好。
二.key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出来的。
(7)ref
一.显示索引的那一列被使用了,如果使用的话,是一个常数,那些列或常量被用于查找索引列的值
(8)rows
一. 根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数
(9).Extra
额外信息。如using index,using filesort,using where 等