zoukankan      html  css  js  c++  java
  • MySQL——通过EXPLAIN分析SQL的执行计划

    在MySQL中,我们可以通过EXPLAIN命令获取MySQL如何执行SELECT语句的信息,包括在SELECT语句执行过程中表如何连接和连接的顺序。

    select_type:表示SELECT的类型,常见的取值有:

    类型
    说明
    SIMPLE
    简单表,不使用表连接或子查询
    PRIMARY
    主查询,即外层的查询
    UNION
    UNION中的第二个或者后面的查询语句
    SUBQUERY
    子查询中的第一个
    table:输出结果集的表(表别名)

    type:表示MySQL在表中找到所需行的方式,或者叫访问类型。常见访问类型如下,从上到下,性能由差到最好:

    ALL
    全表扫描
    index
    索引全扫描
    range
    索引范围扫描
    ref
    非唯一索引扫描
    eq_ref
    唯一索引扫描
    const,system
    单表最多有一个匹配行
    NULL
    不用扫描表或索引
    possible_keys: 表示查询可能使用的索引
    key: 实际使用的索引
    key_len: 使用索引字段的长度
    ref: 使用哪个列或常数与key一起从表中选择行。
    rows: 扫描行的数量
    filtered: 存储引擎返回的数据在server层过滤后,剩下多少满足查询的记录数量的比例(百分比)
    Extra: 执行情况的说明和描述,包含不适合在其他列中显示但是对执行计划非常重要的额外信息
    最主要的有一下三种:

    Using Index
    表示索引覆盖,不会回表查询
    Using Where
    表示进行了回表查询
    Using Index Condition
    表示进行了ICP优化
    Using Flesort
    表示MySQL需额外排序操作, 不能通过索引顺序达到排序效果
    什么是ICP?

    MySQL5.6引入了Index Condition Pushdown(ICP)的特性,进一步优化了查询。Pushdown表示操作下放,某些情况下的条件过滤操作下放到存储引擎。

    EXPLAIN SELECT * FROM rental WHERE rental_date='2005-05-25' AND customer_id>=300 AND customer_id<=400;

    在5.6版本之前:

    优化器首先使用复合索引idx_rental_date过滤出符合条件rental_date='2005-05-25'的记录,然后根据复合索引idx_rental_date回表获取记录,最终根据条件customer_id>=300 AND customer_id<=400过滤出最后的查询结果(在服务层完成)。

    在5.6版本之后:

    MySQL使用了ICP来进一步优化查询,在检索的时候,把条件customer_id>=300 AND customer_id<=400也推到存储引擎层完成过滤,这样能够降低不必要的IO访问。Extra为Using index condition就表示使用了ICP优化。

    原文链接:

    https://www.cnblogs.com/songwenjie/p/9409852.html
    ————————————————
    版权声明:本文为CSDN博主「景恩」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/niejingen/article/details/106158145

  • 相关阅读:
    Js Array 删除
    语音播报功能
    js实现HashTable
    Js 克隆
    获取电脑名和IP地址
    获取电脑名和Ip
    IIS 配置问题
    WCF 服务
    【并查集】wikioi1001舒适的路线
    【实用】读取信息
  • 原文地址:https://www.cnblogs.com/nje19951205/p/12900200.html
Copyright © 2011-2022 走看看