Mysql оптимизировать, чтобы избежать сканирования таблицы
Пожалуйста, рассмотрите следующую таблицу:
_____________________
| 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. Есть ли у вас идеи по оптимизации, чтобы не нужно было сканировать всю таблицу все время?
1 ответ
Решение
Вы можете попробовать самостоятельно присоединиться, как это:
SELECT COUNT(DISTINCT sw1.word_id)
FROM sentence_word sw1
JOIN sentence_word sw2 ON (
sw1.sent_id = sw2.sent_id
AND sw2.word_id = [your word id]
)
WHERE sw1.word_id != [your word id]
или, может быть, даже лучше
SELECT COUNT(DISTINCT sw1.word_id)
FROM sentence_word sw1
JOIN sentence_word sw2 ON (
sw1.sent_id = sw2.sent_id
AND sw2.word_id = [your word id]
AND sw2.word_id != sw1.word_id
)