У меня довольно большая таблица, в которой хранятся слова, содержащиеся в сообщениях электронной почты.
mysql> explain t_message_words;
+----------------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------------+---------+------+-----+---------+----------------+
| mwr_key | int(11) | NO | PRI | NULL | auto_increment |
| mwr_message_id | int(11) | NO | MUL | NULL | |
| mwr_word_id | int(11) | NO | MUL | NULL | |
| mwr_count | int(11) | NO | | 0 | |
+----------------+---------+------+-----+---------+----------------+
таблица содержит около 100 миллионов строк
mwr_message_id - это таблица FK для сообщений
mwr_word_id - это таблица FK для слов
mwr_count - количество вхождений слова mwr_word_id в сообщение mwr_message_id
. Для вычисления наиболее часто используемых слов я использую следующий запрос
SELECT SUM(mwr_count) AS word_count, mwr_word_id
FROM t_message_words
GROUP BY mwr_word_id
ORDER BY word_count DESC
LIMIT 100;
, который выполняется почти вечно (более получасана тестовом сервере)
mysql> show processlist;
+----+------+----------------+--------+---------+------+----------------------+-----------------------------------------------------
| Id | User | Host | db | Command | Time | State | Info
+----+------+----------------+--------+---------+------+----------------------+-----------------------------------------------------
processlist
| 41 | root | localhost:3148 | tst_db | Query | 1955 | Copying to tmp table | SELECT SUM(mwr_count) AS word_count, mwr_word_id
FROM t_message_words
GROUP BY mwr_word_id |
+----+------+----------------+--------+---------+------+----------------------+-----------------------------------------------------
3 rows in set (0.00 sec)
Что я могу сделать, чтобы "ускорить" запрос (кроме добавления большего количества оперативной памяти, большего количества процессоров, более быстрых дисков)?
спасибо взаранее
Стефано
PS ОБЪЯСНИТЬ результат:
mysql> EXPLAIN SELECT SUM(mwr_count) AS word_count, mwr_word_id
-> FROM t_message_words
-> GROUP BY mwr_word_id
-> ORDER BY word_count DESC
-> LIMIT 100;
+----+-------------+-----------------+-------+---------------+----------------------+---------+------+----------+---------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-----------------+-------+---------------+----------------------+---------+------+----------+---------------------------------+
| 1 | SIMPLE | t_message_words | index | NULL | IDX_t_message_words2 | 4 | NULL | 94823285 | Using temporary; Using filesort |
+----+-------------+-----------------+-------+---------------+----------------------+---------+------+----------+---------------------------------+
1 row in set (0.01 sec)