索引自己提供订单吗?

时间:2011-04-11 14:39:10

标签: sql indexing

让我说我有

create table mytable(
 a VARCHAR(200)
 b VARCHAR(200)
 c VARCHAR(200)
)

create index on mytable (b)

如果我选择

select a, b, c from mytable;

它会按b排序吗?

4 个答案:

答案 0 :(得分:6)

也许(在我想象的聚集索引的情况下更可能),但你不能依赖它或期望它。除非您有order by,否则假设它不会被订购。

答案 1 :(得分:5)

您应该从不假设查询返回的数据将以任何特定顺序排列。确保数据排序的唯一方法是显式请求(通常使用ORDER BY子句)数据库引擎对查询返回的数据进行排序和排序。

答案 2 :(得分:4)

不,因为您未在示例查询中使用b上的索引。

那将使用聚簇索引扫描或表扫描。

而且,正如Kieren正确指出的那样,SQL中没有隐含的顺序。即使您在查询中使用了索引,结果顺序也会受到您几乎无法控制的事物的影响,例如查询引擎使用的内部联接(哈希匹配,合并联接,嵌套循环)。

如果您想要有序的结果,请使用ORDER BY

答案 3 :(得分:2)

索引有两种主要类型:聚类和非聚类。

群集索引确定表中的物理行顺序。插入表(或更新相应字段)会导致数据库引擎重新排序数据,以便对其上的聚类索引进行正确排序。这就是为什么在任何表上只能有一个聚类索引。

非聚类索引是列的副本,根据需要排序。它们是分开存在的,物理行顺序与它们没有关联。这就是为什么可以有任意数量的非聚类索引。

通常,单个表上的简单选择会按物理顺序返回行,因此按照聚类索引的方式对它们进行排序也就不足为奇了。

但是,这不能保证,你不应该依赖它。如果结果集顺序有任何问题,始终包含ORDER BY子句。

如果按聚类索引进行排序,则数据库引擎没有太多工作要做,但您的意图很明确。

如果按非聚类索引进行排序,则需要为DB做更多的工作,但是(取决于表大小和数据类型)它将比完全无索引的字段的排序快几个数量级。