在 Postgres 中创建哪个索引?

Posted

技术标签:

【中文标题】在 Postgres 中创建哪个索引?【英文标题】:Which index to create in Postgres? 【发布时间】:2020-04-27 16:16:13 【问题描述】:

我有一张桌子:

row_id          attr_id    attr_val
180000001       100        test1
180000001       101        test2
180000001       102        test3
180000001       103        test4
180000001       104        test5
180000002       100        test6
180000002       101        test7
180000002       102        test8
180000002       103        test9
180000002       104        test10

它有超过 50 亿行,表大小约为 1.4 TB。我通常运行以下查询:

select * from table1 where rec_id = 180000002;

select * from table1 where rec_id = 180000002 and va_id = 100;

考虑到空间和我的用例,我应该在 Postgres 中应用哪种类型的索引才能最有效?

【问题讨论】:

rec_idrow_id? va_idattr_id? 【参考方案1】:

对于这些查询,您需要以下索引:(rec_id, va_id)

真的是说select *吗?如果您能够将 select 子句中的列数减少到几列,那么您可能还想将它们添加到索引中。

例如,如下查询:

select col1, col2 from table1 where rec_id = 180000002 and va_id = 100;

将有益于索引(rec_id, va_id, col1, col2):这使得索引覆盖,数据库可能仅通过查看索引就可以完全执行它。

【讨论】:

我应该使用 Btree 还是 Brin?如果我使用Btree,索引创建需要很多时间,而且很大。 @dang:你可能想要两个都试试。 BRIN 的成本较低,但效率也可能较低。

以上是关于在 Postgres 中创建哪个索引?的主要内容,如果未能解决你的问题,请参考以下文章

在 postgres 中创建一个范围

postgres:从命令行在数据库中创建表

如果存在多个索引,Postgres 如何选择使用哪个索引?

在postgres中创建一个支点

在 Postgres 9.6 中创建数据透视表

在 postgres 8.1 中创建表时出错