2015-06-11 3 views
0

Пожалуйста, обратите внимание на следующую таблицу: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. Есть ли у вас какие-либо идеи по его оптимизации, что вам не нужно постоянно сканировать всю таблицу?

+0

сделать автообъединение вместо этого? – jarlh

+0

что это такое, как в И слово! = [Желаемое слово] Он не указан в ваших данных – LoztInSpace

+0

@LoztInSpace Извините, у него была орфографическая ошибка. Это должно быть 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 
) 
+0

Звучит неплохо, спасибо –

Смежные вопросы