MYSQL查询速度调优----性能分析

前言

随着接触项目层次的不断提高,数据查询的时效性被摆在了第一位。如何在单表中快速查询出自己期望的数据?如何更有效率的书写SQL语句?这篇博客主要讲述关于MYSQL性能分析的一点知识。

一、了解MYSQL查询性能优化器

MySQL中有专门负责优化SELECT语句的优化器模块,主要功能就是通过计算分析系统中收集到的统计信息,为客户端请求的Query提供他认为最优的执行计划(他认为最有的数据检索方式,但不见得是DBA认为是最优的,这部分最耗时间),意思就是说我们写sql语句,到了mysql那里就不见得就会按我们说的一一执行,他可能会换一种更为高效的方式帮我们达到目的。(不管怎么说,查出来的结果会是我们需要的结果

二、对sql进行性能评估

Explain: explain可以说是一个mysql自带的工具,他可以反映出表的执行顺序等关键信息可以作为后期优化的参考。

(1).id

反映表的加载顺序

(2).select_type

查询类型:

  1. SIMPLE ------- 简单的SELECT查询,查询中不包含子查询或者UNION。
  2. PRIMARY ------- 查询中若包含人和复杂的子部分,最外层查询则被标记为PRIMARY。
  3. SUBQUERY ------- 在SELECT或者WHERE列表中包含了子查询。
  4. DERIVED(MATERIALIZED) ------- 在FROM列表中包含的子查询被标记为DERIVED(衍生表)MySQL会递归执行这些子查询,并把结果放在临时表里。
  5. UNION ------ 若第二个SELECT出现在UNION之后,则被标记为UNION;若UNION包含在FROM子句的子查询中,外层SELECT将被标记为:DERIVED。
  6. UNION RESULT ------ 从UNION表获取结果的SELECT

注:DEPENDENT SUBQUERY ,会严重消耗性能。

(3).type

(注意)访问使用了哪种类型:

  1. All: 全表扫面(最差的情况,如果数据量很大就必须做优化)。

  2. const:表示通过索引一次就找到了,例如 select * from table where id = xxx;

  3. eq_ref :只有一条记录匹配,工作中很少用到

  4. ref (常用): 返回与索引值匹配到的所有记录

一般查询我们达到index,range级别就可以算是优化了。

(4).possible_keys 和 key

possible_keys : 意思就是本次查询可能用到的索引,但是实际不一定用上。
key : 本次查询真正用到的索引。type也是参考实际用到的索引做出评判。

(5).ref

显示哪些列或者常量(const)被用于查找索引列上的值。

(6).rows

每张表有多少行被优化查询了。也是一个评判的重要指标。

(7).Extra

Extra列中出现的信息一般不是太重要,但是还是有很多信息我们可以从这里面获取到:

  1. using index:出现这个说明mysql使用了覆盖索引,避免访问了表的数据行,效率不错!
  2. using where:这说明服务器在存储引擎收到行后将进行过滤。有些where中的条件会有属于索引的列,当它读取使用索引的时候,就会被过滤,所以会出现有些where语句并没有在extra列中出现using
    where这么一个说明。
  3. using temporary:这意味着mysql对查询结果进行排序的时候使用了一张临时表。
  4. using filesort:这个说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。

注:
对于单表查询,一定要根据 where 后面的字段建立索引,遇到有 <、>、!= 这样的关系运算符,会使已经建完的索引失效
对于双表查询,左外连接只会因为右表的索引而被优化,右外连接只会因为左表的索引而被优化,内连接则因为两个表的索引都可以被优化
对于三表查询,则根据是左连接对右边的连接建立索引,根据右连接对左边的连接建立索引

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值