开发者社区> 问答> 正文

PostgreSQL可以索引数组列吗?

我在文档中找不到这个问题的明确答案。如果列是数组类型,是否将对所有输入的值分别进行索引?

我创建了一个只有一int[]列的简单表,并在其上添加了唯一索引。我注意到我无法添加相同的int数组,这使我相信索引是数组项的组合,而不是每个项的索引。

INSERT INTO "Test"."Test" VALUES ('{10, 15, 20}'); INSERT INTO "Test"."Test" VALUES ('{10, 20, 30}');

SELECT * FROM "Test"."Test" WHERE 20 = ANY ("Column1"); 索引对这个查询有帮助吗? 问题来源于stack overflow

展开
收起
保持可爱mmm 2020-02-07 01:10:41 876 0
1 条回答
写回答
取消 提交回答
  • 是的,您可以为数组建立索引,但是必须使用数组运算符和GIN-index类型。

    例:

    CREATE TABLE "Test"("Column1" int[]);
    INSERT INTO "Test" VALUES ('{10, 15, 20}');
    INSERT INTO "Test" VALUES ('{10, 20, 30}');
    
    CREATE INDEX idx_test on "Test" USING GIN ("Column1");
    
    -- To enforce index usage because we have only 2 records for this test... 
    SET enable_seqscan TO off;
    
    EXPLAIN ANALYZE
    SELECT * FROM "Test" WHERE "Column1" @> ARRAY[20];
    

    结果:

    Bitmap Heap Scan on "Test" (cost=4.26..8.27 rows=1 width=32) (actual time=0.014..0.015 rows=2 loops=1) Recheck Cond: ("Column1" @> '{20}'::integer[]) -> Bitmap Index Scan on idx_test (cost=0.00..4.26 rows=1 width=0) (actual time=0.009..0.009 rows=2 loops=1) Index Cond: ("Column1" @> '{20}'::integer[]) Total runtime: 0.062 ms 注意 在许多情况下,似乎需要gin__int_ops选项

    create index <index_name> on <table_name> using GIN ( gin__int_ops) 我还没有看到没有gin__int_ops选项就可以与&&和@>运算符一起使用的情况

    2020-02-07 01:10:55
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
PostgreSQL 物联网六脉神剑 立即下载
PostgreSQL在哈啰的实践-周飞 立即下载
PostgreSQL高并发数据库应用数据 立即下载

相关镜像