zoukankan      html  css  js  c++  java
  • mysql explain extra理解详解

    Extra表示附加信息,常见的有如下几种(也按查询效率从高到低排列):

    Using index

    表示使用索引,如果只有 Using index,说明他没有查询到数据表,只用索引表就完成了这个查询,这个叫覆盖索引如果同时出现Using where,代表使用索引来查找读取记录, 也是可以用到索引的,但是需要查询到数据表。

    using index & using where

    查找使用了索引,但是需要的数据都在索引列中能找到,所以不需要回表查询数据

    Using index condition

    在5.6版本后加入的新特性(Index Condition Pushdown),会先条件过滤索引,过滤完索引后找到所有符合索引条件的数据行,随后用 WHERE 子句中的其他条件去过滤这些数据行,也就是说需要回表查询

    Using where

    表示优化器需要通过索引回表查询数据  

    Using filesort

    Using filesort表示在索引之外,需要额外进行外部的排序动作。导致该问题的原因一般和order by有者直接关系,一般可以通过合适的索引来减少或者避免。

    示例

    explain SELECT * FROM table_item WHERE user_id = 2 ORDER BY item_id LIMIT 0, 5

    user_id 和 item_id 分别建立一个索引,对此语句MySQL选择了 user_id索引,那么 item_id 的索引没有起到任何用处。当排序时记录数较多,内存中的排序 buffer满了,只能 Using filesort 进行外部排序。
    解决方式为对这两列建立组合索引。

    explain SELECT * FROM table_item WHERE user_id = 2 and user_age > 20 ORDER BY item_id LIMIT 0, 5

    建立组合索引(user_id, user_age, item_id),看似非常完美。但由于user_age规则不是确定值,使用该组合索引的话实际上需要先按索引找出一个个user_age下的东西后再对其进行排序,仍然会filesort。
    解决方式是使用组合索引(user_id, item_id),对排序好的item_id再过滤到不满足user_age > 20的条目,不会出现filesort。

    explain SELECT * FROM table_item WHERE user_id = 2 ORDER BY item_attr desc, item_id LIMIT 0, 5

    建立了组合索引(user_id, item_attr, item_id),因为item_attr是降序而item_id是升序,从而仍然需要外部排序。
    如果item_attr和item_id都是升序或者都是降序,则不会出现filesort;建立组合索引(user_id, item_attr desc, item_id)现象依旧。
    Mysql5.1在线文档“13.1.4. CREATE INDEX语法”中提到:“一个index_col_name规约可以以ASC或DESC为结尾。这些关键词将来可以扩展,用于指定递增或递减索引值存储。目前,这些关键词被分析,但是被忽略;索引值均以递增顺序存储。”
    可以看出无法通过修改索引来避免这个filesort,只能是如果可能的话修改查询的排序条件。

    Using temporary

    表示为了得到结果,使用了临时表,这通常是出现在多表联合查询,结果排序的场合。

     

    转 http://www.itxm.cn/post/16521.html

  • 相关阅读:
    java.util.Dictionary源码分析
    java.util.HashMap源码分析
    公钥密码与数字签名
    迭代器模式(Iterator Pattern)
    EIGamal密码体制
    RSA安全性问题
    观察者模式(Observer Pattern)
    不对称密钥密码体系之RSA
    大道至简第七章读后感
    产生随机数
  • 原文地址:https://www.cnblogs.com/wl-blog/p/15207350.html
Copyright © 2011-2022 走看看