我在 MySQL 中有 WordNet 词法数据库。我正在寻找给定单词的同义词。目前,数据以多对多关系的形式显示在三个表中:
words - (147,000 行)
wordid, word
synsets - (119,000 行)
synsetid
sense - (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 秒,而每个外部查询都需要大约 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 秒内执行。