我在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秒
答案 0 :(得分:2)
avoiding IN and NOT IN(在您的情况下只是IN)与INNER JOIN ON
可以提升效果。
修改强>
这些链接:
研究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中的所有单词。