让我说我有
create table mytable(
a VARCHAR(200)
b VARCHAR(200)
c VARCHAR(200)
)
create index on mytable (b)
如果我选择
select a, b, c from mytable;
它会按b排序吗?
答案 0 :(得分:6)
也许(在我想象的聚集索引的情况下更可能),但你不能依赖它或期望它。除非您有order by
,否则假设它不会被订购。
答案 1 :(得分:5)
您应该从不假设查询返回的数据将以任何特定顺序排列。确保数据排序的唯一方法是显式请求(通常使用ORDER BY
子句)数据库引擎对查询返回的数据进行排序和排序。
答案 2 :(得分:4)
不,因为您未在示例查询中使用b
上的索引。
那将使用聚簇索引扫描或表扫描。
而且,正如Kieren正确指出的那样,SQL中没有隐含的顺序。即使您在查询中使用了索引,结果顺序也会受到您几乎无法控制的事物的影响,例如查询引擎使用的内部联接(哈希匹配,合并联接,嵌套循环)。
如果您想要有序的结果,请使用ORDER BY
。
答案 3 :(得分:2)
索引有两种主要类型:聚类和非聚类。
群集索引确定表中的物理行顺序。插入表(或更新相应字段)会导致数据库引擎重新排序数据,以便对其上的聚类索引进行正确排序。这就是为什么在任何表上只能有一个聚类索引。
非聚类索引是列的副本,根据需要排序。它们是分开存在的,物理行顺序与它们没有关联。这就是为什么可以有任意数量的非聚类索引。
通常,单个表上的简单选择会按物理顺序返回行,因此按照聚类索引的方式对它们进行排序也就不足为奇了。
但是,这不能保证,你不应该依赖它。如果结果集顺序有任何问题,始终包含ORDER BY子句。
如果按聚类索引进行排序,则数据库引擎没有太多工作要做,但您的意图很明确。
如果按非聚类索引进行排序,则需要为DB做更多的工作,但是(取决于表大小和数据类型)它将比完全无索引的字段的排序快几个数量级。