Этот вопрос немного сложен для меня, и я не могу объяснить его в одном предложении, поэтому название может показаться довольно двусмысленным.
У меня есть 3 таблицы в базе данных MySQL, их структура показана ниже:
- список слов (5 миллионов строк)
+-----+--------+
| wid | word |
+-----+--------+
| 1 | foo |
| 2 | bar |
| 3 | hello |
+-----+--------+
paper_word_relation (10 миллионов строк)
+-----+-------+
| pid | word |
+-----+-------+
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 1 |
| 2 | 3 |
+-----+-------+
paper_citation_relation (80K строк)
+----------+--------+
| pid_from | pid_to |
+----------+--------+
| 1 | 2 |
| 1 | 3 |
| 1 | 4 |
| 2 | 1 |
| 2 | 3 |
+----------+--------+
Я хочу узнать, сколько статей содержит слово W, и процитировать статьи также содержат слово W. (для каждого слова в списке)
Я использую два внутренних соединения, чтобы выполнить эту работу, но оно кажется очень медленным, когда слово популярно - выше 50 с (довольно быстро, если слово используется редко - ниже 0,1 с), вот мой код
SELECT COUNT(*) FROM (
SELECT a.pid_from, a.pid_to, b.word FROM paper_citation_relation AS a
INNER JOIN paper_word_relation AS b ON a.pid_from = b.pid
INNER JOIN paper_word_relation AS c ON a.pid_to = c.pid
WHERE b.word = 2 AND c.word = 2) AS d
Как я могу сделать это быстрее?Мой запрос недостаточно эффективен или проблема с объемом данных?
Я могу предложить только одно решение: я удаляю слова, встречающиеся меньше 2 в таблице paper_word_relation
.(Около 4 миллионов слов встречаются только один раз)
Спасибо!