SQL嵌套查询使用IN缓慢

时间:2012-05-19 15:29:04

标签: mysql sql full-text-search

我在MySQL中有WordNet词汇数据库。我希望找到给定单词的同义词。目前,数据在三个表中列为多对多关系:

- (147,000行)
wordid,word

synsets - (119,000行)
synsetid

感觉 - (206,000行)
wordid,synsetid

所有表都设置了索引。

每个单词可以有多个同义词集,每个单词集可以有多个单词。我希望返回给定单词的所有同义词的所有单词。每个单词往往有大约2个同义词(一个用于动词用法,一个用于名词)我正在使用的SQL查询是:

SELECT w.word
FROM sense s
INNER JOIN words w
ON s.wordid = w.wordid
WHERE s.synsetid 
IN
(
SELECT s.synsetid
FROM words w
INNER JOIN sense s
ON w.wordid = s.wordid 
WHERE w.word = "word_to_search"
)
AND w.word <> 'word_to_search' ORDER BY synsetid

然而这似乎需要很长时间(约0.75秒)。分解查询时,内部查询需要〜0.0005秒,每个外部查询需要相似。

那么我做错了什么?是否有更合适的方法来构建此查询?

修改

所以我在阅读下面的链接文章后想出的解决方案是:

SELECT w.word
FROM sense s
INNER JOIN words w
ON s.wordid = w.wordid
JOIN
(
SELECT s.synsetid
FROM words w
INNER JOIN sense s
ON w.wordid = s.wordid 
WHERE w.word = "word_to_search"
) i
ON i.synsetid = s.synsetid

执行时间约为0.0008秒

2 个答案:

答案 0 :(得分:2)

avoiding IN and NOT IN(在您的情况下只是IN)与INNER JOIN ON可以提升效果。

修改

这些链接:

link 1

link 2

研究JOINS与IN和其他可互换操作的有效性。然而,他们得出结论,IN和NOT IN 不需要

答案 1 :(得分:0)

也许这(更新)

SELECT w2.word, synsetid
FROM words w
INNER JOIN synset s  on  s.wordId = w.wordID
INNER JOIN words2 w2 on w2.wordID = s.wordID
WHERE w.word = "word_to_search"
GROUP BY w2.word, synsetid
ORDER BY synsetid, w2.word

现在我想我明白你想要什么。与请求的单词在同一个synset中的所有单词。