整个上午我都在尝试在 jsonb 文档上创建索引,但我看不到索引有任何好处。
我的 table :
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}'
谢谢。
最佳答案
您的查询没有使用创建的索引,因为该索引是基于表达式创建的,而您没有使用该表达式。正确的查询是:
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);
这样您可以不加修改地使用您的查询,但索引会大得多。
关于json - Postgres json 索引对查询速度没有影响,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32365375/