【问题标题】:Postgres json index has no effect on query speedPostgres json索引对查询速度没有影响
【发布时间】:2015-11-28 16:23:40
【问题描述】:

我整个早上都在尝试在 jsonb 文档上创建索引,但我看不到索引有任何好处。

我的桌子:

CREATE TABLE modelling.triangle(id serial, data JSONB)

这是我的插入:

    INSERT INTO modelling.triangle(data)
    SELECT
    json_build_object(
              'x', generator.x,
              'y', generator.y,
              'array', generator.array_data)::jsonb
    FROM (
        SELECT 
        generate_series(1,10000) x, 
        generate_series(1,10000) y, 
        array_to_json(array_agg(array_elements)) array_data
        FROM (
            SELECT 
            generate_series(1,99) as key, 
            generate_series(1,99) as value
        ) array_elements
    ) as generator

还有索引:

CREATE INDEX idxgintags ON modelling.triangle USING gin ((data -> 'x') jsonb_path_ops);

然后选择:

EXPLAIN ANALYZE 
SELECT data->'array'
FROM modelling.triangle
WHERE data@>'{"x":10}'

谢谢。

【问题讨论】:

    标签: json performance postgresql indexing


    【解决方案1】:

    您的查询未使用创建的索引,因为该索引是基于表达式创建的,而您没有使用该表达式。正确的查询是:

    EXPLAIN ANALYZE 
    SELECT data->'array'
    FROM modelling.triangle
    WHERE data->'x' @> '10'
    

    您可以在JSON Types 中阅读更多相关信息。

    另一种方法是使用 jsonb_path_ops 在数据字段上创建索引

    CREATE INDEX idxgintags2 ON modelling.triangle USING gin (data  jsonb_path_ops);
    

    这样您可以不加修改地使用查询,但索引会大得多。

    【讨论】:

    • 啊,谢谢,我不知道如何使用索引。我的查询已从 1000 毫秒降至 0.124。干杯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-24
    • 2012-08-12
    • 2011-04-24
    相关资源
    最近更新 更多