假设我们有一个包含600万条记录的表。其中有16个整数列和一些文本列。这是只读表,因此每个整数列都有一个索引。每条记录大约50-60字节。
表名为“Item”
服务器配置为: 12 GB RAM, 1.5 TB SATA, 4 CORES,全部用于PostgreSQL数据库。
在数据库中还有许多其他表,因此RAM无法覆盖整个数据库。
我想在"Item"表中添加一个名为"a_elements"的列(大型整数数组类型),每条记录在此列中最多不超过50-60个元素。
之后,我将在此列上创建GIN索引,并且典型的查询应该类似于这样:
select * from item where ...... and '{5}' <@ a_elements;
我还有第二种更传统的选择。
不要将列a_elements添加到表项中,而是创建具有两个列的elements表:
- id_item
- id_element
该表将有大约2亿记录。
我能够对这些表进行分区,因此元素表中的记录数量会减少到2000万,在item表中为50万。
第二个选项查询看起来像这样:
select item.*
from item
left join elements on (item.id_item=elements.id_item)
where ....
and 5 = elements.id_element
我想知道在性能角度上哪个选项更好。 Postgres能否在单个查询中使用许多不同的GIN索引(选项1)?
我需要做出一个明智的决定,因为导入这些数据需要20天。