MySQLにWordNet字句データベースがあります。与えられた単語の同義語を探しています。現在、データは多対多の関係として3つのテーブルに設定されています。
単語-(147,000行)
wordid、word
synsets-(119,000行)
synsetid
センス-(206,000行)
wordid、synsetid
すべてのテーブルにはインデックスが設定されています。
各単語には複数のシンセットを含めることができ、各シンセットには複数の単語を含めることができます。特定の単語のすべてのシンセットのすべての単語を返すことを探しています。単語ごとに約2つのシンセットが存在する傾向があります(1つは動詞の使用用、もう1つは名詞用)これに使用している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秒で実行されます。