Postgres json索引对查询速度没有影响

时间:2015-09-03 00:54:10

标签: json performance postgresql indexing

我一直在尝试在整个早上创建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}'

谢谢。

1 个答案:

答案 0 :(得分: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);

通过这种方式,您可以不加修改地使用您的查询,但索引会更大。