我一直在尝试在整个早上创建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}'
谢谢。
答案 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);
通过这种方式,您可以不加修改地使用您的查询,但索引会更大。