【问题标题】:SQLite - Are there alternatives to rtree for indexing lines on an axis?SQLite - 是否有 rtree 的替代品来索引轴上的线?
【发布时间】: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 变体,它将值存储为整数而不是浮点数。

标签: sql sqlite genetics


【解决方案1】:

首先,尽管您不能完全索引它,但您可以仅按开始间隔索引。如果 90% 的间隔都有 start=stop,那应该会有很大的改进。唯一的减速是间隔很长。

【讨论】:

  • 问题是,如果你有一个 start=100 和 stop=200 的区间,你想查询重叠 150-160 的区间。这需要两个不等式,这非常慢
猜你喜欢
  • 1970-01-01
  • 2015-11-13
  • 1970-01-01
  • 2010-09-08
  • 2017-03-25
  • 2015-01-27
  • 1970-01-01
  • 1970-01-01
  • 2013-01-29
相关资源
最近更新 更多