次の表を検討してください。
_____________________
| sentence_word |
|---------|---------|
| sent_id | word_id |
|---------|---------|
| 1 | 1 |
| 1 | 2 |
| ... | ... |
| 2 | 4 |
| 2 | 1 |
| ... | ... |
このテーブル構造で、文章の単語を保存したいと思います。今度は、文の特定の単語と一緒にある単語を見つけたいと思います。結果は次のようになります。
_____________________
| word_id | counted |
|---------|---------|
| 5 | 1000 |
| 7 | 800 |
| 3 | 600 |
| 1 | 400 |
| 2 | 100 |
| ... | ... |
クエリは次のようになります。
SELECT
word_id,
COUNT(*) AS counted
FROM sentence_word
WHERE sentence_word.sent_id IN (SELECT
sent_id
FROM sentence_word
WHERE word_id = [desired word]
)
AND word_id != [desired word]
GROUP BY word_id
ORDER BY counted DESC;
クエリは正常に機能していますが、常にテーブル全体をスキャンします。sent_id と word_id のインデックスを作成しました。常にテーブル全体をスキャンする必要がないことを最適化するためのアイデアはありますか?