2014-02-17 31 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))