一尘不染

SQL-没有索引的DISTINCT怎么这么快?

sql

我有一个数据库,在SQLite中有一个名为“链接”的表,其中有6亿行。数据库中有2列-“ src”列和“ dest”列。目前没有索引。

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

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

首先,SELECT * FROM links WHERE src=434923 AND dest=5010182。现在,这将相当快地返回一个结果,然后运行相当长的时间,因为我假设它正在对其余的600m行执行表扫描。

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

有什么想法为什么SELECT DISTINCT比标准快得多SELECT


阅读 146

收藏
2021-03-17

共1个答案

一尘不染

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

2021-03-17