如果我有一个表,在辅助列上有一个索引,使用辅助列获取数据是否能保证结果始终按一致的顺序排列?
例如,假设我有一个表 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:您在查询中还有其他内容(更多内容在WHERE
、GROUP BY
、LIMIT
、HAVING
等(现在所有赌注都关闭了。
案例 2d:(将来的某个时候。 如果优化器可以在多个线程中执行此查询,该怎么办? 现在结果混杂在一起。
底线:如果您想要订单,请使用ORDER BY
。 时期。 句点。
而且,不要太担心性能。 如果优化器可以将ORDER BY
折叠成其他东西(通常是GROUP BY
或PK上的附加(,那么它就会。 这导致ORDER BY
不花费任何额外费用。