同一记录在有序分页查询中多次显示

mar*_*rcv 4 mysql order-by select mysql-5.6

一些记录通过以下查询显示在多个结果“页面”上:

SELECT 
    `description`,
    `wallpaper`
FROM
    `bbr_bar`
WHERE
    `country_id` = '2510769'
ORDER BY
    `online` DESC
Run Code Online (Sandbox Code Playgroud)

例如,id 为 99 的记录显示在第一个“页面”( LIMIT 10 OFFSET 0) 上,但也显示在最后一个“页面”上LIMIT 10 OFFSET 50。显然这不应该发生。

在以下情况下该问题消失:

  • 如果我不过滤查询,或者不排序它( 和country_id都是onlineint(11)不是外键)
  • 如果我从子句中删除两个字段之一SELECT(都是varchar(255),而不是外键)
  • 如果我删除架构中的某些表或字段。然而,经过几个小时的努力,我仍然无法确定哪些表/字段有影响,哪些没有影响。看起来像是随机的(即使我知道不是)。因此,我不会在此处粘贴任何CREATE TABLEINSERT声明,因为我认为它们不相关。

我唯一可以肯定的是,如果我将mysqldump所有表恢复到新模式中,问题仍然存在。

(表中还有其他字段,但添加/删除它们对结果没有影响)。

问题:

  1. 如果我得出的结论是我的模式中的某些内容已损坏,我是对的吗?
  2. 我该如何解决这个问题?

(MySQL 版本:5.6.24 Win32 x86)

Rol*_*DBA 6

我有一些坏消息要告诉你:根据 MySQL 的说法,这不是一个 BUG!

有两个关于此行为的错误报告,并且被认为不重要

这是Bug #69732 中表达的基本原理

如果没有明确的 ORDER BY,结果顺序是未定义的。时期。

即使相同的查询执行两次,结果的顺序也不同,这也没有问题。您可能已经习惯了看似确定性的结果,但这实际上是一种幻觉。这可能是您在通常情况下看到的,但没有任何东西可以保证这一点。随着统计数据的更新、索引树的重新洗牌、数据在不同物理机器上的分区,结果顺序可能会发生变化,因此结果顺序取决于网络延迟......

因此,如果您想要分页,请确保对保证唯一的内容进行 ORDER BY,或者接受这样一个事实:非唯一序列中相同值的排序顺序不是确定性的,并且可以随时更改,恕不另行通知。

在您的特定情况下,该online领域可能不够明确。即使您bbr_bar按 ( country_id, online) 进行索引,这可能仍然不够明显。您可能需要涉及另一列来驱动排序顺序(可能是自动增量字段或时间戳字段)。

试一试!!!!