zoukankan      html  css  js  c++  java
  • MySQL性能优化神器Explain

    本文涉及:MySQL性能优化神器Explain的使用

    简介

    虽然使用Explain不能够马上调优我们的SQL,它也不能给予我们一些调整建议,但是它能够让我们了解MySQL 优化器是如何执行SQL 语句的

    通过Explain,我们可以分析出以下结果:

    • 表的读取顺序
    • 数据读取操作的操作类型
    • 哪些索引可以使用
    • 哪些索引被实际使用
    • 表之间的引用
    • 每张表有多少行被优化器查询

    Explain命令的用法十分简单, 在 select语句前加上 Explain 就可以了, 例如:

    1
    explain select * from user;

    它的结果主要包含以下字段
    id、select_type、table、partitions、type、possible_keys、key、ref、rows、filtered、extra
    接下来我们来看一下各个字段的含义

    id 查询序列号

    加载表的顺序
    1
    连接查询各个表的加载顺序是相同的,所以都为1

    2
    包含子查询的时候,先执行子查询,所以user表的id值最大

    select_type 查询类型

    常用取值有:

    • SIMPLE:简单的select查询,不包含子查询和索引
    • PRIMARY:查询中若包含任何子查询,最外层查询则为记为PRIMARY
    • SUBQUERY:在SELECT或WHERE列表中包含了子查询
    • DERIVED:在FROM列表中包含的子查询被标记为DERIVED(衍生),MySQL会递归执行这些子查询,把结果放在临时表中
    • UNION:若第二个SELECT出现在索引之后,则被标记为UNION:若索引包含在FROM子句的子查询中,外层SELECT将被标记为:DERIVED
    • UNION RESULT:从索引表获取结果的查询
    table查询涉及的表或衍生表
    type查询类型

    通过 type 字段, 我们可以判断此次查询是全表扫描还是索引扫描等,type 常用的取值有:

    • system:表只有一条数据
    • const:针对主键或唯一索引的等值查询扫描, 简单理解为一次读取就获取到了数据,例如下面这个主键索引的查询
      3
    • eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描
    • ref:非唯一性索引扫描,返回匹配某个单独值的所有行
    • range:表示使用索引范围查询,例如=、<>、>、>=、<、<=、IS、 NULL、<=>、BETWEEN、IN等
    • index: 所要查询的数据直接在索引树中就可以获取到, 而不需要扫描数据,例如:
      4
    • ALL: 表示全表扫描, 这个类型的查询是性能最差的查询

    type 类型的性能比较
    通常来说, 不同的 type 类型的性能关系如下:
    ALL < index < range < ref < eq_ref < const < system

    possible_keys查询时能够使用到的索引.

    possible_keys 表示 MySQL 在查询时, 能够使用到的索引. 注意并不是一定用,实际使用是由 由 key 字段决定

    key 查询使用的索引

    此字段是 MySQL 在当前查询时所真正使用到的索引.

    key_len使用索引的字节数

    这个字段可以评估组合索引是否完全被使用, 或只有最左部分字段被使用到.

    rows MySQL估算要查找到结果集需要扫描读取的数据行数
    Extra额外的信息

    常见的有以下几种内容:

    • Using filesort:MySQL 需额外的排序操作, 不能通过索引顺序达到排序效果. 一般有 Using filesort, 都建议优化去掉, 因为这样的查询 CPU 资源消耗大.
    • Using index:表示查询在索引树中就可查找所需数据, 不用扫描表数据文件, 往往说明性能不错
    • Using temporary:查询有使用临时表, 一般出现于排序, 分组和多表 join 的情况, 查询效率不高, 建议优化.
    • Using where:表明使用了where过滤
    • Using join buffer:表明使用了连接缓存,比如说在查询的时候,多表join的次数非常多,那么将配置文件中的缓冲区的join buffer调大一些
    • impossible where:where子句的值总是false,不能用来获取任何元组
    • select tables optimized away:在没有GROUPBY子句的情况下,基于索引优化MIN/MAX操作或者对于MyISAM存储引擎优化COUNT(*)操作,不必等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化
    • distinct:优化distinct操作,在找到第一匹配的元组后即停止找同样值的动作
  • 相关阅读:
    HDU 1025 Constructing Roads In JGShining's Kingdom (DP+二分)
    HDU 1158 Employment Planning
    HDU 2059 龟兔赛跑
    Csharp 简单操作Word模板文件
    Csharp windowform datagridview Clipboard TO EXCEL OR FROM EXCEL DATA 保存datagridview所有數據
    Csharp 讀寫文件內容搜索自動彈出 AutoCompleteMode
    Csharp windowform controls clear
    CSS DIV大图片右上角叠加小图片
    Csharp DataGridView自定义添加DateTimePicker控件日期列
    Csharp 打印Word文件默認打印機或選擇打印機設置代碼
  • 原文地址:https://www.cnblogs.com/zhixiang-org-cn/p/10935156.html
Copyright © 2011-2022 走看看