为什么在两个相同的 MariaDB 实例中对相同数据进行相同查询时会得到不同的排序?

Ali*_*EXE 1 mariadb

我有两个容器。两者是相同的。两者都是使用两个不同服务器上的相同docker-compose.yml文件启动的。两者具有相同的数据。完全相同(一个在另一个中备份并恢复)。

然而,对于同一查询,我得到了不同的排序。

这是我的查询:

SELECT `i`.`Id`, 
       `i`.`Guid`, 
       `i`.`Key`, 
       `i`.`Name`, 
       `i`.`Order`, 
       `i`.`PartTypeId`, 
       `i`.`PartTypeKey`, 
       `i`.`SectionId`, 
       `i`.`SectionKey`
FROM `ItemPartViews` AS `i`
WHERE `i`.`SectionId` = 7
ORDER BY `i`.`Order`
Run Code Online (Sandbox Code Playgroud)

这些是结果的图像:

在此输入图像描述在此输入图像描述

我不明白为什么我会得到不同的排序。任何解释表示赞赏。

J.D*_*.D. 11

为什么在两个相同的 MariaDB 实例中对相同数据进行相同查询时会得到不同的排序?

你正在田地里分类i.Order。在您的数据示例屏幕截图中,该Order列中的值都是相同的(它们都是0)。这使得这是一种不确定性排序(伪随机)。

可以这样想,如果你有一盒 20 个红球,每个红球上都印有不同的形状,你告诉某人将它们从盒子里拿出来并按颜色对它们进行分类,那么它们是哪个球并不重要第一个放置的和最后放置的一个,因为它们的颜色都相同。如果您然后将它们全部放回盒子中,并要求另一个人做同样的事情(按颜色排序),他们放置球的顺序仍然无关紧要,并且可能会与第一个人所做的不同。

这就是这里发生的事情。当对非唯一字段进行排序时,它是一种不确定的排序,并且不能保证这些行实际返回的顺序。SQL 引擎中的一些因素决定了实际的顺序,但它也太重要了。复杂,知名度不够高,最重要的是,设计无法保证。

如果您将i.Id或其他一些唯一字段添加到您的ORDER BY子句中,那么您的行将始终以相同的顺序返回。因为按唯一字段排序是确定性的