小编Ell*_*ren的帖子

PostgreSQL 位串的索引(每个最多 20,000 位)

我正在构建一个包含化合物(数百万行)的表,并且这些化合物的某些预先确定的特征/片段被标记在固定长度的位串中。这个位串将有 2000 到 20000 位,需要做进一步的研究来确定更精确的数字。在搜索具有某些特定特征或缺乏特定特征的化合物时,会在此位串的选定子集上进行搜索。每次都可以是不同的子集。

在 PostgreSQL(9.6 或 10)中是否有一种索引类型可以使这些搜索变得高效?

插入不常见并且以批处理方式完成,而搜索是最常用的操作,并且应该最好是快速的并且没有误报或漏报。

对我来说,这听起来像是 GIN 索引的工作,但我对这种索引类型的理解不足以确定是否真的如此。

实际上可能还有另一种解决方案,那就是创建一个单独的“fragment_index”表,其中包含片段标识符(因为它们在位串中具有固定位置,因此它们也有一个数字标识符)+复合 ID 对。我担心的是该表可能会变得很大(20M 化合物,片段上平均 50 次命中 = 1G 行)和多个连接(每个片段一个),其中连接也可以返回高达 80% 的匹配与化合物表(在某些情况下,这很可能)根本不会执行。

我会很感激得到任何关于方向的建议,以便在路上。

更新:我在带有编码短代码的 varchar 数组上使用 trigram 模块尝试了 GIN 索引,它给出了混合结果,主要取决于过滤操作后剩余的数据量。

为了给出有意义的例子,让我们假设表格如下所示:

CREATE TABLE testcompounds (
 id serial primary key,
 cd_structure text,
 features_as_text varchar(128),
 features_as_bits bit varying(32)
);

CREATE INDEX flags_testcompounds on testcompounds using gin (features_as_text gin_trgm_ops);


CREATE TABLE fragments (
 id serial primary key,
 smarts text,
 keystring varchar(4),
 frequency int 
);


insert into fragments (keystring,smarts) values('AAA', '*=O');
insert …
Run Code Online (Sandbox Code Playgroud)

postgresql index bitmap-index

6
推荐指数
1
解决办法
1542
查看次数

标签 统计

bitmap-index ×1

index ×1

postgresql ×1