MySQL 子查询中order by不生效问题

一个偶然的机会,发现一条 SQL 语句在不同的 MySQL 实例上执行得到了不同的结果。 问题描述 创建商品表 product_tbl 和商品操作记录表 product_operation_tbl 两个表,来模拟下业务场景,结构和数据如下: 接下来需要查询所有商品最新的修改时间,使用如下语句: select t1.id, t1.name, t2.product_id, t2.created_at from product_tbl t1 left join (select * from product_operation_log_tbl order by created_at desc) t2 on t1.id = t2.product_id group by t1.id; 通过结果可以看到,子查询先将 product_operation_log_tbl 里的所有记录按创建时间(created_at)逆序,然后和 product_tbl 进行 join 操作,进而查询出的商品的最新修改时间。 在区域 A 的 MySQL 实例上,查询商品最新修改时间可以得到正确结果,但是在区域 B 的 MySQL 实例上,得到的修改时间并不是最新的,而是最老的。通过对语句进行简化,发现是子查询中的 order by created_at desc 语句在区域 B 的实例上没有生效。 排查过程 难道区域会影响 MySQL 的行为?经过 DBA 排查,区域 A 的 MySQL 是 5.6 版,区域 B 的 MySQL 是 5.7 版,并且找到了这篇文章: ...

七月 29, 2021 · 2 分钟 · Zhiya