我在StackOverflow question about it强中读到了MySQL EXPLAIN的安全性,后来的一位 comments 者(@Tye)说:

人们想办法通过"解释"来更新信息.

这是我今天一直在思考的一个问题--is有没有办法用一条EXPLAIN EXTENDED ...语句来实际更改/修改/更改数据库服务器中的数据?

EXPLAIN ANALYZE ...在MySQL8.x+中似乎完全能够更改数据,因为它执行查询,因此如果语句更改了任何内容,它可能会产生影响.这就说得通了.但我的问题是关于一份原始的EXPLAIN EXTENDED ...声明.

有什么方法可以用来更改数据吗?

我执行了很多不同的EXPLAIN ...条语句,但我从来没有见过一条语句改变了数据……但我很好奇,是否有人比我更聪明,知道有什么方法可以做到这一点.在我看来,我想不出任何用EXPLAIN EXTENDED ...语句实际更改数据的方法,因为:

  • 最外层的查询从不执行,它只被分析/计划.因此,它不会对数据库服务器中的数据产生任何影响.
  • 子查询may会被执行,因此可能会导致性能问题,但subqueries in MySQL are always SELECT statements...哪一个应该是安全的?

推荐答案

要估计表统计信息,EXPLAIN必须在类似于以下格式的查询中实际运行子查询.

EXPLAIN SELECT ... FROM (SELECT ... ) AS t;

这仍然不会更改原始表中的数据,但从理论上讲,它可以创建一个大小不受限制的临时表,如果它使I/O负担过重或填满可用磁盘空间,则可能会影响并发查询.

子查询不能是修改数据的任何语句.子查询只能是SELECT、TABLE或VALUES--所有这些都是只读语句.

请注意,如果解释INSERT、UPDATE、DELETE、REPLACE等DML语句,则需要运行这些查询的权限,即使解释不会实际执行这些操作来修改数据.

此外,您不能在设置为read_only=1的实例上为这些DML语句运行解释.但这并不意味着解释会修改数据.

Mysql相关问答推荐

SQL条件 Select 和条件WHERE

MySQL grant语句中的用户名区分大小写

MySQL 搜索列字段字符串

错误 2020 (HY000): 数据包大于 'max_allowed_pa​​cket' 字节,docker 容器内出现 mysql 错误

将类图转换为SQL数据库

如何在 mysql 中获取 Day Wise 的平均值?

SQL使用LIMIT获取结果和结果中的行数

Mysql,显示谁已经和没有 Select 退出巴士服务

如何将内置的时间浏览器过滤器反映到 Grafana 中的 mysql 查询中?

如何替换 SELECT 查询中重复记录的列?

我在查询中没有得到正确的结果

进行 MySQL COUNT 查询

为什么在有 BEGIN 和 END 时为存储过程指定分隔符?

如何使用 C++ 连接 mySQL 数据库

org.hibernate.InstantiationException:没有实体的默认构造函数::principal.Cliente

MYSQL_ROOT_PASSWORD 已设置但在 docker 容器中获取用户'root'@'localhost'的访问被拒绝(使用密码:YES)

Mysql中int(10)的最大大小是多少

在 Ubuntu 上安装 mysql gem 的困难

如何在执行 sql 脚本时 echo 打印语句

SELECT INTO 和未声明的变量错误