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

标签 json performance postgresql indexing

整个上午我都在尝试在 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/

相关文章:

java - 没有明确答案 : Which Java Map is the cheapest?

postgresql - 在 SQLAlchemy 中设置 PostgreSQL 配置参数

c# - 更新大量数据时重复键值错误

javascript - 迭代 AJAX 响应

java - 获取 json 错误 : end of input at character 0 of

android - ActivityRecord 的 Activity 空闲超时

database - PostgreSQL 字段每 24 小时更改一次

java - 如何解码 JSON 文件上的 Base64 编码字符串

JSON 验证预期 'EOF'

java - Java 6 更新 19,20 中的绘图性能与 Java 6 更新 3 相比?