如果有人问你,对查询执行EXPLAIN是否可以改变你的数据库,你可能会说不会; 通常都是这么认为的。EXPLAIN应该向我们展示查询是如何执行的,而不是执行查询,因此它不能更改任何数据。

不幸的是,在这种情况下,常识并不适用于MySQL(在写这篇文章的时候,MySQL 8.0.21和以前的版本)-有一些情况下,explain可以改变你的数据库,就像这个Bug所示:

mysql> select version();+-----------+| version() |+-----------+| 5.7.31 |+-----------+1 row in set (0.01 sec)mysql> DELIMITER $$mysql> CREATE FUNCTION `cleanup`() RETURNS char(50) CHARSET utf8mb4-> DETERMINISTIC-> BEGIN-> delete from test.t1;-> RETURN 'OK';-> END $$Query OK, 0 rows affected (0.00 sec)mysql>

这与更理智的PostgreSQL行为不同,后者在运行EXPLAIN时不会执行存储函数(如果你运行EXPLAIN ANALYZE,则会执行)。

在MySQL中,这个决定来自于尝试做正确的事情并提供最可靠的解释(查询执行计划很可能取决于存储函数返回什么),但似乎没有考虑这种安全权衡。

尽管当前MySQL EXPLAIN设计的这种后果是最严重的后果之一,但你还遇到一个问题,即EXPLAIN(理性的用户希望这是检查查询性能的一种快速方法)可能需要花费大量时间才能完成, 例如:

mysql> explain select * from (select sleep(5000) as a) b;

虽然很不幸有这样的行为,但只有在拥有不受限制的权限时才会发生。如果有一个更复杂的设置,行为可能会有所不同。

如果用户缺少EXECUTE权限,EXPLAIN语句将失败。

mysql> explain select * from (select cleanup()) as t1clean;ERROR 1370 (42000): execute command denied to user 'abce'@'localhost' for routine 'test.cleanup'
mysql> explain select * from (select cleanup()) as t1clean;ERROR 1142 (42000): DELETE command denied to user 'abce'@'localhost' for table 't1'

·建议用户设置权限以进行正确的监控。这应该是这个(以及许多其他)问题的第一道防线,但是,这很难依靠。许多用户将选择简单的方式,并将使用具有完全特权的“ root”用户进行监控。

·将EXPLAIN语句包装在BEGIN…ROLLBACK中,这将撤消EXPLAIN可能造成的任何损害。缺点当然是删除数据的“工作”,并且在撤消工作时将完成工作。(注意:当然,这仅适用于事务表。如果你仍然运行MyISAM,在这种情况下,有更严重的问题需要担心)

·使用“set transaction read-only”,表示不希望进行任何写操作。在这种情况下,尝试写数据的EXPLAIN将失败,并且不做任何工作。

虽然这些变通办法可以使工具更安全地运行EXPLAIN,但它不能帮助用户直接运行EXPLAIN,并且我真的希望通过重新设计EXPLAIN来解决此问题,就像PostgreSQL那样不会尝试运行存储函数。对于那些想知道如何精确执行查询的人,现在有了EXPLAIN ANALYZE。

更多相关文章

  1. Android(安卓)多模拟器使用adb shell
  2. Linux系统查看磁盘可用空间的5个命令
  3. Android(安卓)bluetooth介绍(四): a2dp connect流程分析
  4. Android(安卓)命令行编译、打包生成apk文件
  5. Ionic 运行报错No resource identifier found for attribute 'ap
  6. 使用sencha cmd创建android应用
  7. Android执行shell命令
  8. Android下模拟按键输入
  9. 【【【常用的ubuntu第三方工具及android命令(自存档)】】】二

随机推荐

  1. Ubuntu 下TinyOS在CC2530上移植之环境搭
  2. 055 Python第三方库安装
  3. Process Pool实现Python的并行执行
  4. Python学习笔记(3):数据集操作-列的统一操作
  5. Linux中Python安装与配置(CentOS-6.5:Pyth
  6. Python列表和字典的学习
  7. Python Django Vue 项目创建
  8. 在Python / IPython解释器中为单个下划线
  9. 深入理解python中得闭包
  10. 16讲 序列!序列!