MySQL - 使用二级索引列获取数据时保证结果顺序



如果我有一个表,在辅助列上有一个索引,使用辅助列获取数据是否能保证结果始终按一致的顺序排列?

例如,假设我有一个表 T,其中包含 PKColumn、列 A、列 B、列 C....

和 A 列上的索引,例如在 ASC 中

查询是否select * from T where ColumnA = '<some-value>'保证结果始终以相同的顺序返回(基于在 ColumnA 上创建的索引的排序方向?

No.

在没有ORDER BY子句的情况下,引擎可以自由地以任何顺序提供结果集。更重要的是,随着时间的推移,顺序可能不一致。您今天可以按一个顺序获取行,但明天可能会有所不同。

现在,考虑到您已经在列ColumnA上有一个索引,那么您可以通过添加ORDER BY子句来修改查询以确保所需的顺序,如下所示:

select * 
from T 
where ColumnA = '<some-value>'
ORDER BY ColumnA

此查询将以边际额外费用提供所需的有序结果集。如果要检索的行数较少(小于 1000(,则性能变化应该几乎察觉不到。

对于较大的结果集,可以实现性能优化。在这种情况下,您需要提供确切的查询来帮助您。

ColumnA 上的索引,比如在 ASC 中

查询,从 T 中选择 *,其中 ColumnA =constant保证结果始终以相同的顺序返回

简短的回答:不可以。

长答案:

情况 1:如果只有一行具有该值,则没有"订单"来"保证"。

情况 2:有多个行具有该值。 好吧,索引没有指定如何处理 dupColumnA值。 InnoDB通过跟踪PRIMARY KEY列来实现二级索引。 所以。。。

情况 2a:如果优化程序选择使用该索引,它将按 PK 顺序排列。

情况 2b:如果它选择不使用该索引,则优化器可能执行了表扫描。 所以,再一次,它将按PK顺序排列。

情况 2c:您在查询中还有其他内容(更多内容在WHEREGROUP BYLIMITHAVING等(现在所有赌注都关闭了。

案例 2d:(将来的某个时候。 如果优化器可以在多个线程中执行此查询,该怎么办? 现在结果混杂在一起。

底线:如果您想要订单,请使用ORDER BY。 时期。 句点。

而且,不要太担心性能。 如果优化器可以将ORDER BY折叠成其他东西(通常是GROUP BY或PK上的附加(,那么它就会。 这导致ORDER BY不花费任何额外费用。

相关内容

  • 没有找到相关文章

最新更新