zoukankan      html  css  js  c++  java
  • mysql-explain执行计划

    explain执行计划:

    1. id

    每个select对应着一个id  在连接查询中id值相同,排在前面的是驱动表

    2. select type

      - simple 查询子句中不包含union或者子查询

      - primary 使用union和子查询来说,最左边的那个查询就是primary

      - union  使用union和子查询来说,最左边的那个查询是primary 其余的查询是union

      - unionResult  使用临时表去完成union查询的去重

      - subquery 包含子查询的sql 不是相关子查询 并且不能转为semi-join,并且优化器决定采用物化表进行优化 则子查询的第一个select的selecttype是subquery

      - dependent subquery 包含子查询的sql 是相关子查询 并且不能转为semi-join,则子查询的第一个select的selecttype是dependent  subquery

      - dependent union 使用union或unionall查询中,如果子查询依赖于外层查询 除了第一个子查询 其余的子查询都是dependent union

      SELECT * FROM s1 WHERE key1 IN (SELECT key1 FROM s2 WHERE key1 = 'a' UNION SELECT key1 FROM s1 WHERE key1 = 'b');

      画横线的select type为 dependent subquery 加粗的为 dependent union

      - derived  使用物化优化 ,则物化表对应的查询是derived

      - materialized 在包含子查询语句时,将子查询物化后和外部查询进行join连接查询 子查询的select type为materialized

    3. type

      - system

      - const 对主键或唯一二级索引等值匹配

      - eq_ref 在连接查询时,被驱动表是通过主键或唯一二级索引 等值查询 如果是联合唯一二级索引 则所有的索引列都需要等值匹配 则被驱动表的type是eq_ref

      - ref 普通二级索引等值匹配

      - ref_or_null 普通二级索引等值匹配 值中有null

      - index_merge

      - unique_subquery in查询中优化器优化为exists子查询,并且与子查询使用主键等值匹配

      - index_subquery in查询中优化器优化为exists子查询,并且与子查询使用二级索引等值匹配

      - range 使用索引的范围查询

      - index 索引覆盖并全索引查询

      - all

      越前性能越高 除了index merge都用到一个索引

    4. possible_keys/key 

      可能用到的key 和实际用到的key possible keys 越多说明计算成本越高

    5. key_len

      优化器使用的索引记录的最大长度

      - 固定的长度类型 最大长度是固定值 变长是实际占用的最大存储空间

      - 可以存null key_len比普通的+1

      - 变长字段比普通key_len+2

    6. ref

      表示与普通二级索引列等值匹配的方式是什么

    7. rows

      如果用all 就代表需要扫描的行数 用索引就是索引的记录数  

    8. filtered 

      联合查询中 使用索引 在扇出的记录中有多少条满足其他条件的记录百分比 主表的rows*filtered = 需要对驱动表进行多少次查询

    9. extra

      - no tables used

      - impossible where  where 条件永远为false

      - no matching min/max row 函数中有max/min函数 但是没有符合where条件的记录

      - using index  查询列表和条件使用覆盖索引的情况

      - using index condition

      - using where 使用全表扫描,并且where中有全表扫描表的条件

      - not exists 使用左连接,where 要求某个列等于null,但是那个列不允许存储null值

      - Using intersect(...)、Using union(...)和Using sort_union(...)
      - zero limit limit 0
      - using filesort 使用文件排序

      - using join buffer 使用基于块的嵌套循环算法

      - using temporary 使用临时表

      - start temporary end temporary 子查询的时候使用 semi-join优化 建立临时表去重 驱动表的显示start 被驱动表显示end

      - looseScan in查询转为semi-join 采用looseScan策略

      - firstMatch in查询转为semi-join 采用firstMatch策略

  • 相关阅读:
    express基础介绍
    gruntjs
    小写转换大写(人民币)
    Elasticsearch学习系列之多文档操作mget
    java.util.Date和java.sql.Date的使用方法,转载
    spring学习IOC
    oracle10g手动创建scott(tiger)的方法(转)
    观察者模式
    简单工厂,工厂模式,抽象工厂
    win7主机+winxp虚拟机,虚拟机使用主机的无线网卡(转)
  • 原文地址:https://www.cnblogs.com/isnotnull/p/14440390.html
Copyright © 2011-2022 走看看