MYSQL查询速度调优----性能分析
前言
随着接触项目层次的不断提高,数据查询的时效性被摆在了第一位。如何在单表中快速查询出自己期望的数据?如何更有效率的书写SQL语句?这篇博客主要讲述关于MYSQL性能分析的一点知识。
一、了解MYSQL查询性能优化器
MySQL中有专门负责优化SELECT语句的优化器模块,主要功能就是通过计算分析系统中收集到的统计信息,为客户端请求的Query提供他认为最优的执行计划(他认为最有的数据检索方式,但不见得是DBA认为是最优的,这部分最耗时间),意思就是说我们写sql语句,到了mysql那里就不见得就会按我们说的一一执行,他可能会换一种更为高效的方式帮我们达到目的。(不管怎么说,查出来的结果会是我们需要的结果)
二、对sql进行性能评估
Explain: explain可以说是一个mysql自带的工具,他可以反映出表的执行顺序等关键信息可以作为后期优化的参考。
(1).id
反映表的加载顺序
(2).select_type
查询类型:
- SIMPLE ------- 简单的SELECT查询,查询中不包含子查询或者UNION。
- PRIMARY ------- 查询中若包含人和复杂的子部分,最外层查询则被标记为PRIMARY。
- SUBQUERY ------- 在SELECT或者WHERE列表中包含了子查询。
- DERIVED(MATERIALIZED) ------- 在FROM列表中包含的子查询被标记为DERIVED(衍生表)MySQL会递归执行这些子查询,并把结果放在临时表里。
- UNION ------ 若第二个SELECT出现在UNION之后,则被标记为UNION;若UNION包含在FROM子句的子查询中,外层SELECT将被标记为:DERIVED。
- UNION RESULT ------ 从UNION表获取结果的SELECT
注:DEPENDENT SUBQUERY ,会严重消耗性能。
(3).type
(注意)访问使用了哪种类型:
-
All: 全表扫面(最差的情况,如果数据量很大就必须做优化)。
-
const:表示通过索引一次就找到了,例如 select * from table where id = xxx;
-
eq_ref :只有一条记录匹配,工作中很少用到
-
ref (常用): 返回与索引值匹配到的所有记录
一般查询我们达到index,range级别就可以算是优化了。
(4).possible_keys 和 key
possible_keys : 意思就是本次查询可能用到的索引,但是实际不一定用上。
key : 本次查询真正用到的索引。type也是参考实际用到的索引做出评判。
(5).ref
显示哪些列或者常量(const)被用于查找索引列上的值。
(6).rows
每张表有多少行被优化查询了。也是一个评判的重要指标。
(7).Extra
Extra列中出现的信息一般不是太重要,但是还是有很多信息我们可以从这里面获取到:
- using index:出现这个说明mysql使用了覆盖索引,避免访问了表的数据行,效率不错!
- using where:这说明服务器在存储引擎收到行后将进行过滤。有些where中的条件会有属于索引的列,当它读取使用索引的时候,就会被过滤,所以会出现有些where语句并没有在extra列中出现using
where这么一个说明。 - using temporary:这意味着mysql对查询结果进行排序的时候使用了一张临时表。
- using filesort:这个说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。
注:
对于单表查询,一定要根据 where 后面的字段建立索引,遇到有 <、>、!= 这样的关系运算符,会使已经建完的索引失效
对于双表查询,左外连接只会因为右表的索引而被优化,右外连接只会因为左表的索引而被优化,内连接则因为两个表的索引都可以被优化
对于三表查询,则根据是左连接对右边的连接建立索引,根据右连接对左边的连接建立索引