我正在构建一个包含化合物(数百万行)的表,并且这些化合物的某些预先确定的特征/片段被标记在固定长度的位串中。这个位串将有 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)