【问题标题】:Postgres 9.3 index involving JSON column涉及 JSON 列的 Postgres 9.3 索引
【发布时间】:2014-03-17 11:31:45
【问题描述】:

我有这个表结构:

CREATE TABLE user_items
(
  user_id bigint references users(id) NOT NULL,
  item_id bigint references items(id) NOT NULL,
  col1 json DEFAULT '[{"text":""}]',
  col2 json DEFAULT '[{"date":"","text":""}]',
  col3 json DEFAULT '{"text":""}',
  PRIMARY KEY (user_id, item_id)
)

我将运行如下查询:

SELECT * FROM user_items WHERE item_id = '?' AND col1 IS NOT NULL

在这种情况下我需要索引(item_id, col1) 吗?

如果是这样,那么正确的做法是什么,因为在尝试它时 Postgres 会抛出错误,因为 col1JSON 类型。

【问题讨论】:

    标签: sql json postgresql indexing


    【解决方案1】:

    我建议在item_id 上使用partial index

    CREATE INDEX foo_idx ON user_items (item_id)
    WHERE col1 IS NOT NULL
    

    col1 的数据类型在这里无关紧要。请务必在查询中包含逐字逐句的 WHERE 子句,以允许 Postgres 使用此索引。

    【讨论】:

    • 谢谢。我认为数据类型相关的原因是因为我不能只对(item_id,col1)进行索引。这似乎是有道理的,因为 'col1' 是 JSON 类型。
    • @haknick:数据类型与 JSON 列上的​​索引相关。我通过将其作为部分索引的条件来避免该问题。 NULL 测试适用于任何类型。
    【解决方案2】:

    只有在每个 item_id 出现多次并且 c​​ol1 通常为 NULL 时才需要它。如果其中任何一个不正确,只需在(item_id) 上创建索引。数据库必须访问该行并过滤掉 col1 为 NULL 的行,但如果 NULL 很少见,那也没什么大不了的。

    如果 NULL 很常见,那么在 (item_id, (col1 is not null)) 上尝试“功能”或“表达式”索引

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-26
      • 1970-01-01
      相关资源
      最近更新 更多