0

我在 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 秒内执行。

4

2 回答 2

2

避免 IN 和 NOT IN(在你的情况下只是 IN)INNER JOIN ON可以提高性能。

编辑:

这些链接:

链接 1

链接 2

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

于 2012-05-19T15:32:38.673 回答
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

现在我想我明白你想要什么了。与请求的单词相同的同义词集中的所有单词。

于 2012-05-19T15:35:55.823 回答