网站程序 制作,个人能接做网站的活么,公司做网络营销,百度网站收录提交入口全攻略一、导读
对于大部分开发人员来说#xff0c;平常接触的无非就是增删改查这些基本操作#xff0c;创建存储过程#xff0c;视图等等都是 DBA 该干的活#xff0c;但是想要把这些基本操作写的近乎完美也是一件难事。
而 explain 显示了 MySQL 如何使用索引来处理 select 语…一、导读
对于大部分开发人员来说平常接触的无非就是增删改查这些基本操作创建存储过程视图等等都是 DBA 该干的活但是想要把这些基本操作写的近乎完美也是一件难事。
而 explain 显示了 MySQL 如何使用索引来处理 select 语句以及连接表。可以通过模拟 mysql 的优化器帮助选择更好的索引和写出更优化的查询语句。
二、explain 能干什么
表的读取顺序数据读取操作的操作类型哪些索引可以使用哪些索引被实际使用表之间的引用每张表有多少行被优化器查询
说了这么多使用 explain 的好处,那么实际上到底该怎么玩? 答案 explain 待执行的sql 从上表中我们看到通过 explainsql 执行后显示了一张列表那么接下来我们就详细说说这个个列表中各个字段的意思只有先明确了各个字段的意思才能知道 sql 的优劣程度。
三、explain 结果解释
id 决定表的读取顺序。 执行 select 语句查询的序列号包含一组数字表示查询中执行 select 子句或操作表的顺序
它有三种情况:
1、id相同执行顺序由上至下
2、id不同如果是子查询id的序号会递增id值越大优先级越高越先被执行
3、id相同与不同同时存在如果 id 相同可以认为是一组从上往下顺序执行,在所有组中id值越大优先级越高越先执行
select_type
查询的类型也就是数据读取操作的操作类型。他一共包含以下几种类型。
simple简单的 select 查询,查询中不包含子查询或者 union
primary查询中若包含任何复杂的子查询最外层查询则被标记
subquery在 select 或者 where 列表中包含了子查询
derived在 from 列表中包含的子查询被标记为 DERIVED(衍生表)mysql 会递归执行这些子查询把结果放临时表中
union若第二个 select 出现在 union 之后,则被标记为 union若 union 包含在 from 子句的子查询中外层 select 将被标记为 DERIVED
union result从 union 表(即 union 合并的结果集)中获取 select 查询的结果
type 访问类型一个 sql 性能的重要指标 显示查询使用了何种类型,从最好到最差依次是 system const eq_ref ref range index all
system表只有一行记录(等于系统表)这是 const 类型的特例平时不会出现,这个也可忽略不计
const表示通过索引一次就找到了const 用于比较 primary key 或者 unique 索引。因为只匹配一行记录所以很快。如果将主键置于 where 列表中mysql 就能将该查询转换成一个常量
eq_ref唯一性索引扫描对于每一个索引键表中只有一条记录与之匹配常用于主键或唯一索引扫描
ref非唯一性索引扫描返回匹配某个单独值得所有行本质上也是一种索引访问它返回所有匹配某个单独值的行然而它可能会找到多个符合条件的行所以它应该属于查找和扫描的混合体
range只检索给定范围的行使用一个索引来选择行key 列显示使用哪个索引一般就是在你的 where 语句中出现了 between、in 等的查询这种范围索引扫描比全表扫描要好因为它只需要开始于索引的某一个点结束于另一个点不用扫描全部索引
indexindex 于 all 区别为 index 类型只遍历索引树这通常比 all 快因为索引文件通常比数据文件小。也就是说虽然 all 和 index 都是读写表但 index 是从索引中读取的而 all 是从硬盘中读的
all也就是全表扫描 备注一般来说得保证查询至少达到 range 级别最好能达到ref。 possible_keys
显示可能会被应用到这张表的索引一个或者多个。查询涉及到的字段上若存在索引则该索引将被列出但不一定被查询实际使用到。
key
实际使用到的索引。如果为 null则没有使用索引。查询中若使用了覆盖索引则该索引仅出现在key 列表中。
key_len
表示索引中使用的字节数可通过该列计算查询中使用的索引的长度在不损失精确性的情况下长度越短越好。 key_len 显示的值为索引字段的最大可能长度并非实际使用长度即 key_len 是根据表定义计算而得不是通过表内检索出的。
ref
显示索引的哪一列被使用了如果可能的话是一个常数哪些列或常量别用于查找索引列上的值。
rows
根据表统计信息及索引选用情况大致估算出找到所需的记录所需要读取的行数。
Extra
包含不适合在其它列中显示但十分重要的额外信息。
1、using filesort (出现这个东西不好)说明 mysql 会对数据使用一个外部的索引排序而不是按照表内的索引顺序进行读取mysql 中无法利用索引完成的排序操作称为文件排序。 2、using temporary(出现这个东西更不好,使用到了临时表)使用了临时表保存中间结果Mysq 在对查询结果排序时使用临时表常见于排序 order by 和分组查询 group by。 3、using index表示相应的 select 操作中使用了覆盖索引(Covering Index)避免了访问了表的数据行效率不错
如果同时出现 using where表明索引被用来执行索引键值的查找。 如果没有同时出现 using where表明索引用来读取数据而非执行查找操作 using where:使用了whereimpossible where:where 子句的值总是false,不能用来获取任何元素;select tables optimized away:在没有group by子句的情况下,基于索引优化MIN/MAX操作或者对于MyISAM存储引擎优化count(*)操作,不必等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化;distinct 三、覆盖索引
理解方式一
就是 select 的数据列只用从索引列中就能取得不必读取数据行Mysql 可以利用索引返回 select列表中的字段而不必根据索引再次读取数据文件换句话说查询列要被所建的索引列覆盖。
理解方式二
索引是高效找到行的一个方法但是一般数据库也能使用索引找到一个列的数据因此它不必读取整个行毕竟索引的叶子节点存储了索引数据。当能通过读取索引就可以得到想要的数据那就不需要读取行了。一个索引包含了(或者覆盖了)满足查询结果的数据就叫做覆盖索引。 注意 如果要使用覆盖索引一定要注意 select 列表中只取出需要的列不可 select *因为如果将所有的字段一起做索引会导致索引文件过大查询性能下降。