SQL - 如果没有索引,DISTINCT如何快速?

时间:2010-12-27 23:43:48

标签: sql database optimization sqlite

我有一个数据库,里面有一个名为'links'的表,其中有6亿行在SQLite中。数据库中有2列 - “src”列和“dest”列。目前没有指数。

src和dest之间有相当多的公共值,但也有相当数量的重复行。

我要做的第一件事是删除所有重复的行,然后对结果执行一些额外的处理,但是我遇到了一些奇怪的问题。

首先,SELECT * FROM links WHERE src=434923 AND dest=5010182。现在这会很快返回一个结果,然后需要很长时间才能运行,因为我假设它正在600米行的其余部分执行表扫描。

但是,如果我SELECT DISTINCT * FROM links,那么它会立即开始快速返回行。问题是:这怎么可能?当然,对于每一行,必须将该行与表中的所有其他行进行比较,但这需要表格中的其余行的表格扫描,应该需要很长时间!

为什么SELECT DISTINCT比标准SELECT快得多?

2 个答案:

答案 0 :(得分:4)

想一想。如果未应用任何排序,则可以按扫描顺序返回结果。它只保留了到目前为止看到的值的列表(更可能是一个有效的结构,如b树)。如果未找到给定值,则返回该值并将其添加到簿记结构中。绝对不需要与所有其他行进行比较。

答案 1 :(得分:2)

为了更准确,一个查询不比另一个快。更准确地说,查询完成所花费的时间对于两个查询应该是相同的。不同之处在于使用DISTINCT的查询只返回更多行,因此它会以更快的速度接收行,因此响应速度更快。然而,在两者的引擎下发生的是相同的表扫描。 distinct查询具有一个数据结构,用于存储已返回的内容并过滤重复项。因此,它应该实际上需要更长的时间,直到查询完成但(返回的行)/时间更长,因为只有更多的行匹配。 (另请注意:某些查看者添加了查询结果限制,可以使不同的查询运行得更快(因为您达到了结果限制并停止)。)