【发布时间】:2011-02-02 14:38:42
【问题描述】:
我正在尝试创建一个包含起点和终点的位置数据库:基本上是一维轴上的线。我想有效地查询与给定间隔重叠的所有位置。在传统的表中,查询需要两个不等式,因此不能被索引。您也可以使用 R-Tree 索引,但它们似乎是为多维范围查询而设计的。有没有更有效的方法在轴上存储线?
如果有人好奇,数据库是用来存储基因组区间的。这是一个示例表:
CREATE TABLE lines (id INTEGER PRIMARY KEY, start INTEGER, stop INTEGER);
做到这一点的基本方法是:
SELECT * FROM lines WHERE start <= <end of interval> AND stop >= <start of interval>;
同样,这真的很慢并且无法被索引。 R-Tree 会像这样工作:
CREATE VIRTUAL TABLE lines_index USING RTREE (id, start, stop);
SELECT * from lines_index WHERE start <= <end of interval> AND stop >= <start of interval>;
R-Trees 不适合我们的实现,所以我想知道是否有任何替代方案...
【问题讨论】:
-
你为什么说 R-Trees 不是你的实现的最佳选择?虽然它们可以处理多维数据,但您也可以将它们用于一维数据。
-
对不起,应该在那里扩展。我写了一些 rtree 与传统索引的测试,rtree 表现不佳。我们的用例非常独特,原因如下: 1) 大多数 (~90%) 变体都是单点 - 开始和停止是相同的。 2) 表格真的很大 - 数千万行。 3) 位置是整数,而不是浮点数。 4)变体实际上是按染色体与位置存储的,所以我们做了很多后查询处理。所以,我想看看是否还有其他选择,比如区间树。
-
我意识到这已经超过 2 年了,但我想知道您是否尝试过 sqlite 中的 rtree_i32 R*Tree 变体,它将值存储为整数而不是浮点数。