今天,数据库的操做愈来愈成为整个应用的性能瓶颈了,这点对于Web应用尤为明显。关于数据库的性能,这并不仅是DBA才须要担忧的事,而这更是咱们程序员须要去关注的事情。当咱们去设计数据库表结构,对操做数据库时(尤为是查表时的SQL语句),咱们都须要注意数据操做的性能。这里,咱们不会讲过多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库mysql
1.explain(查看执行计划):使用Explain关键字能够模拟优化器执行SQL查询语句,从而知道MySql是如何处理你的SQL语句的,分析你的查询语句或是表结构的性能瓶颈。程序员
(1.)能干吗?sql
(2.)怎么玩数据库
1.Explain+SQL语句性能
2.执行计划包含的信息优化
2.各名词解释spa
(1)id设计
一.第一种状况blog
二.第二种状况排序
三.第三种状况
(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 等