当您SELECT MIN(x) FROM blah;
同时执行一个表时,MySQL 的行为如何,该表正在经历数千次DELETE
操作?
min() 的结果是否会显示已删除的条目?如果不是,它如何防止从已删除的条目中返回值?
这是因为我们有一个大型数据库,其中 min() 运行了几个小时,但在此期间不断发生删除。
阅读https://dev.mysql.com/doc/refman/8.0/en/innodb-consistent-read.html了解 InnoDB 中的一致性读取。每个 SELECT 语句都保证查看一种数据“快照”,在 SELECT 语句运行时不会更改。
所以你是对的,你确实有 SELECT 语句返回一个值的风险MIN(x)
,因为它在你的 SELECT 语句完成后将不存在,因为它同时被删除了。
这是我们为在不阻塞并发更新/删除的情况下自由进行读取查询所付出的代价。
顺便说一句,如果您想MIN(x)
快速返回,请创建一个索引,x
并将其作为第一列。