除非使用ORDER BY强制执行可预测的结果排序,否则为什么PostgreSQL查询会产生不一致的结果

时间:2017-06-14 05:12:55

标签: mysql postgresql

PostgreSQL doc中说:

  

查询优化器在生成查询计划时会考虑LIMIT,因此您很可能会获得不同的计划(产生不同的行顺序),具体取决于您为LIMIT和OFFSET提供的内容。因此,使用不同的LIMIT / OFFSET值来选择查询结果的不同子集将产生不一致的结果,除非您使用ORDER BY强制执行可预测的结果排序。这不是一个bug;这是SQL不承诺以任何特定顺序传递查询结果这一事实的固有后果,除非使用ORDER BY约束订单。

但是在MySQL InnoDB表中,它们的结果将在PRIMARY KEY中传递。

为什么查询会产生不一致的结果?查询中会发生什么?

1 个答案:

答案 0 :(得分:3)

Postgres文档和您的观察结果告诉您的是,SQL表中的记录没有内部订单。而是在无序的记录集之后建模数据库表。因此,在以下可以在MySQL或Postgres上运行的查询中:

SELECT *
FROM yourTable
LIMIT 5

数据库可以自由返回它想要的5条记录。在MySQL的情况下,如果你看到基于主键的排序,那只是巧合,并且MySQL不会提供任何这样的合同,而这总是会发生。

要解决此问题,使用ORDER BY时应始终使用LIMIT子句。因此,以下查询定义明确:

SELECT *
FROM yourTable
ORDER BY some_column
LIMIT 5