0

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秒で実行されます。

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

今、私はあなたが何を望んでいるかを理解していると思います。要求された単語と同じ synset 内のすべての単語。

于 2012-05-19T15:35:55.823 に答える