2014-02-17 32 views
0

我有这样的表结构:的Postgres 9.3指数涉及JSON列

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类型。

回答

1

我建议索引使用partial indexitem_id

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

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

+0

感谢您的支持。 我认为数据类型相关的原因是因为我不能只在(item_id,col1)上做索引。这似乎是有道理的,因为'col1'是一个JSON类型。 – haknick

+0

@haknick:数据类型*将*与JSON列上的索引相关。我通过将其作为部分索引的条件来避免这个问题。对任何类型的NULL进行测试。 –

0

如果每个item_id出现多次并且col1通常为NULL,则只需要它。如果其中任何一个不正确,只需在(item_id)上进行索引。数据库将不得不访问该行并过滤出col1为NULL的行,但是如果NULL很少,那就没什么大不了。

如果NULL是共同的,然后再尝试一个“功能”或“表达”上(item_id, (col1 is not null))