2009-12-11 52 views
0

我有這樣定義的兩個表:高效的查詢查找的東西,在一個字索引

Page(id), Index(page_id, word) 

PAGE_ID在指數是一個外鍵頁,使每一頁 連接到一組索引條目。索引表是 Page表的索引,因此您可以進行快速文本搜索。 E.g:

SELECT page_id FROM Index where word = 'hello' 

會選擇所有PAGE_ID的包含文字 '你好' 的所有頁面。但是現在我想爲包含 所有單詞'word1','word2'和'word3'的頁面選擇所有page_id。我可以 想出這樣做的最好的查詢是:

SELECT page_id 
FROM Index 
WHERE word IN ('word1', 'word2', 'word3') 
GROUP BY page_id 
HAVING COUNT(1) = 3; 

它的工作原理,但我不知道是否有人能想到可選的更 高效的查詢的?

上面的例子稍微簡化了。在實際的索引表中,單詞被引用Word表的word_id列替換。但基本方法是一樣的。 RDBMS是PostgreSQL,索引表中有大約2百萬行,在Page中有20K行。

回答

0

作爲一個小的事情,我不會把一個表Index,這勢必會造成混亂:)

您的查詢就會發現與word1 3個索引條目頁面。這可能不是一個問題,但你可以改變having到:

HAVING COUNT(DISTINCT word) = 3 

來避免這個問題。

與其他查詢相比,查詢的執行方式取決於很多因素,如關鍵字密度,使用的DBMS以及行數。在您遇到實際性能問題之前,我不會擔心它。

+0

謝謝,你說得對。在這種情況下,page_id和word是唯一的,因此不需要使用不同的檢查。我已經證實,這是導致性能下降的這個查詢。 – 2009-12-11 12:22:38

+0

@BjörnLindqvist:然後發佈完整的問題與查詢計劃「explain 」:) – Andomar 2009-12-11 22:38:16