`
丁林.tb
  • 浏览: 797335 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

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查询,并且返回结果也不需要做值判断

 

 实际执行流程

         Explain 多少是个锦上添花的动作,但是如果实际执行也是这么做,那就会影响性能(增加一次调用next和值比较),这就会对使用性能造成影响。

         所幸的是,5.6.10在执行期间的逻辑还是正确的: 对于unique index的等值查询,只返回一行,在get_next()时有判断,直接返回HA_ERR_END_OF_FILE。

 
多表的explain update   

mysql> explain update tb ,t1  set c=c+1,y=y+1 where tb.id=1 and t1.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 | SIMPLE      | t1    | const | PRIMARY       | PRIMARY | 4       | const |    1 | NULL  |
+—-+————-+——-+——-+—————+———+———+——-+——+——-+

 可以看到多表的explain update结果就是正确的,原因是单表的explain update/delete单独实现了Explain_table,而多表与explain select相同,走的是另外一个类Explain_join,这个过程的逻辑与以前版本(5.5-)是相同的。

 有兴趣的同学可以一起探讨下这个patch

0
1
分享到:
评论

相关推荐

    mysql5.6官方文档

    MySQL 5.6是MySQL数据库管理系统的一个重要版本,它包含了多项增强和优化,旨在提高性能、可用性和可管理性。这份官方文档详细地阐述了MySQL 5.6的各种特性和功能,是学习和掌握该版本数据库操作的重要参考资料。...

    Mysql-5.6 安装包

    MySQL 5.6版本是其一个重要的里程碑,引入了许多性能优化和新特性,为开发者提供了更高效、更灵活的数据存储和管理工具。以下是对MySQL 5.6安装包及其内容的详细解释: 1. **MySQL 5.6的新特性**: - **...

    MYSQL OCP 5.6

    MySQL OCP 5.6是Oracle Certified Professional(OCP)认证的一个特定版本,专注于MySQL数据库管理系统5.6的深入理解和操作。这个认证是为那些希望提升MySQL技能的专业人士设计的,包括DBA(数据库管理员)、系统...

    mysql-5.6.48-winx64.zip

    MySQL 5.6.48是其在Windows 64位操作系统上的一个特定版本,提供了强大的数据存储、管理和检索功能。这个版本对于那些依赖于稳定且高性能数据库服务的服务器尤其重要,因为它修复了一些已知的安全漏洞和性能问题。 ...

    mysql5.6性能优化

    MySQL 5.6版本作为该系列中的一个重要版本,在很多方面都有显著改进,尤其是其在性能优化方面的努力,更是值得深入研究。 优化的本质在于合理安排资源和调整系统参数,使得MySQL能够更加高效地运行,并且尽可能地...

    Python-djangoexplain一个助手用于djangoqueryset取得EXPLAIN或EXPLAINANALYZEOUTPUT

    `django-explain`是一个针对Django框架的辅助工具,专门用来获取Django queryset执行的`EXPLAIN`或`EXPLAIN ANALYZE`输出,以便于开发者进行数据库性能分析。 `EXPLAIN`命令在数据库中用于显示查询的执行计划,它...

    mysql5.6手册

    MySQL 5.6是MySQL数据库管理系统的一个重要版本,它包含了丰富的功能更新和性能优化,旨在为开发者和数据库管理员提供更高效、可靠的数据管理体验。本手册详细介绍了MySQL 5.6的各种特性和使用方法,是学习和掌握该...

    mysql 5.6 官方参考手册 最新 最全

    《MySQL 5.6 官方参考手册》是学习和...手册中的每一个章节都是一个深入学习的入口,对于数据库管理员、开发者和DBA来说,这是一份不可或缺的参考资料。通过深入阅读和实践,可以不断提升对MySQL 5.6的理解和使用能力。

    mysql5.6从零开始学中代码

    MySQL 5.6 是 MySQL 数据库的一个重要版本,它提供了许多功能增强和性能优化,适合初学者和有经验的开发者。在这个"mysql5.6从零开始学中代码"的资料中,我们可以深入学习和实践关于 MySQL 的核心概念、语法以及最佳...

    mysql5.6性能优化总结

    MySQL 5.6 是一个高性能的关系型数据库管理系统,然而随着数据库规模的增长和复杂度的增加,性能问题开始浮现。因此,性能优化成为 MySQL 数据库管理员和开发者的首要任务。本文将总结 MySQL 5.6 的性能优化方法和...

    mysql reference manual 5.6

    MySQL 5.6作为一个重要的数据库管理系统版本,引入了许多增强功能,提升了性能和可用性。以下是对其中关键知识点的详细解释: 1. **SQL语法**:手册涵盖了SQL的基本语法,如SELECT语句用于查询数据,INSERT用于插入...

    MySQL 5.6从零开始学

    MySQL 5.6是MySQL数据库管理系统的一个重要版本,它提供了许多增强的功能和性能优化,使得这个版本成为初学者和专业人士的热门选择。本教程“MySQL 5.6从零开始学”旨在帮助初学者理解数据库的基本概念,并通过实践...

    Oracle中explain_plan的用法

    Oracle 中的 explain_plan 是一个强大的分析工具,能够帮助用户了解 SQL 语句的执行计划,通过它可以了解 Oracle 是如何连接表、使用什么方式扫描表(索引扫描或全表扫描)以及使用到的索引名称。下面详细讲解 ...

    refman-5.6-en.html-chapter

    这仅是MySQL 5.6官方文档的一部分内容概述,实际手册中还包含了更详细的说明、示例和最佳实践,是开发者和DBA进行数据库管理、开发和问题排查的重要参考资料。通过深入学习这份文档,可以全面掌握MySQL 5.6的使用和...

    ORACLE EXPLAIN PLAN的总结

    这将把执行计划存储到一个名为“TABLE”或自定义的表中。 2. 观察执行计划:使用SELECT * FROM TABLE(ANALYZE PLAN)或DBMS_XPLAN.DISPLAY来查看存储的执行计划。 三、执行计划的输出 1. Operation:操作类型,如...

    MySQL安装包 mysql-community-5.6.10.1

    MySQL 5.6.10.1是该系列中的一个特定版本,发布于2013年,带来了许多性能提升和新特性。 1. **安装过程**: - **下载**:首先,你需要从MySQL官方网站或可信的第三方源下载适用于你操作系统的MySQL社区版安装包。 ...

    SQL语句性能分析之explain

    为了更好地理解和优化SQL查询,MySQL提供了一个非常有用的工具——`EXPLAIN`。通过在SQL语句前加上`EXPLAIN`关键字,可以详细展示MySQL如何处理查询语句以及如何使用索引来处理这些查询。这有助于我们选择更高效的...

    DB29.7Visual Explain教程

    下面通过一个具体的例子来进一步说明 **Visual Explain** 的使用方法: 假设我们有一个简单的 SQL 查询: ```sql SELECT * FROM orders WHERE order_date > '2023-01-01'; ``` 1. **开启 Visual Explain**: ```...

    Mysql5.6性能优化

    - **DEPENDENT SUBQUERY**:依赖于外部查询的子查询中的第一个SELECT语句。 - **DERIVED**:用于FROM子句的子查询。 - **table**:表示查询涉及的表名。 - **type**(重要):表示表的连接类型,按性能优劣排序...

Global site tag (gtag.js) - Google Analytics