• 5.6 explain update一个疑似bug


    5.6 的新增特性,允许对DML语句做explain。这下大家高兴了,碰到复杂更新语句(且还造成慢查询)要自己手动改成select语句的日子终于到头了。

    饶有兴致的试用了一把,总体感觉不错,不过发现一个bug。

    复现

    mysql> create table tb(id int primary key , c int);
    Query OK, 0 rows affected (0.01 sec)

    mysql> insert into tb values(1,1);
    Query OK, 1 row affected (0.00 sec)

    mysql> insert into tb values(2,2);
    Query OK, 1 row affected (0.00 sec)

    mysql> explain select * from tb where id=1;
    +—-+————-+——-+——-+—————+———+———+——-+——+——-+
    | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
    +—-+————-+——-+——-+—————+———+———+——-+——+——-+
    | 1 | SIMPLE | tb | const | PRIMARY | PRIMARY | 4 | const | 1 | NULL |
    +—-+————-+——-+——-+—————+———+———+——-+——+——-+
    1 row in set (0.00 sec)

    mysql> explain update tb tb set c=2 where id=1;
    +—-+————-+——-+——-+—————+———+———+——+——+————-+
    | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
    +—-+————-+——-+——-+—————+———+———+——+——+————-+
    | 1 | SIMPLE | tb | range | PRIMARY | PRIMARY | 4 | NULL | 1 | Using where |
    +—-+————-+——-+

    这里我们看到,在explain update的结果中,type=range,并且Extra是Using where。

    这两个值的意思就是,MySQL做了一个range查询,即使只返回一行,也多做了一个next操作,而且Using where,表示从主键取出来的行还做了字段比较。

    或者更直接一点,跟explain select的结果不一致。

    分析

    刚好趁机看一下explain dml的实现。发现explain update/deelte 不是沿用原来的逻辑,而是单独实现了一个Explain_table来处理。

    在这个Explain_table的explain_join_tab逻辑(也就是获取返回结果的type字段的值)中,返回值里没有返回JT_CONST的选项,只有merge和range。

    相同的,由于没有考虑const的情况,在得到Extra列的过程中,最少是Using Where

    实际上,如果对于唯一键上的等值查找,是不需要做range查询,并且返回结果也不需要做值判断

  • 相关阅读:
    Premetheus告警QQ邮箱
    Prometheus+grafana监控SpringBoot2应用
    Grafana整合Prometheus
    Prometheus:入门初体验
    接口幂等性思路
    OpenFeign远程调用丢失请求头问题解决办法
    gradle构建脚本
    windows安装gradle
    CompletableFuture异步编排
    线程池(ThreadPoolExcutor)基本介绍
  • 原文地址:https://www.cnblogs.com/bjanzhuo/p/3576080.html
Copyright © 2020-2023  润新知