2009-12-11 47 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