Я разработал страницу сводки счетов, используя mysql + php.
SQL:
SELECT SUM(value_a) A, SUM(value_b) B, SUM(value_c) C
FROM daily_data_sep_2010
WHERE user_id='<user_id>'
AND type
IN (
'type_a', 'typeb'
)
AND publish_date
BETWEEN '<start_date>'
AND '<end_date>'
GROUP BY publish_date
ORDER BY publish_date DESC
Тип таблицы daily_data_sep_2010 - это MyISAM
Существует несколько типов одинаковых запросов, но SUM (значение_a) A, SUM (значение_b) B, SUM (значение_c) C являются одинаковыми (равными) Условия "WHERE", "GROUP BY" не одинаковы.
Этот экран очень медленный для тяжелых пользователей. У вас есть хорошие решения?
объясните здесь
| table | type | possible_keys | key | key_len | ref | rows | Extra |
| daily_data_sep_2010 | ALL | ОСНОВНОЙ, user_id_key, тип, PUBLISH_DATE |||| 1059756 | Использование где; Использование временных; Использование filesort |
Я думаю, размер строки слишком велик для суммы. поэтому я с нетерпением жду других решений (Hadoop?)
Любая разница, если вы создаете составной индекс на (userid, type) и делаете это:
where userid = ? and type in (a,b)
and publish_date between...
group by publish_date
MySQL 5.1.3 Сервер поддерживает разделение. вы можете ссылаться на разделение mysql, url http://dev.mysql.com/doc/refman/5.1/en/partitioning.html
Вы можете попробовать выполнить запрос с помощью команды explain
.
Однако я бы предположил, что добавление одного из этих индексов поможет (в зависимости от того, как часто встречаются ряды с соответствующими типами):
Это должно позволить ему проконсультироваться только с индексом для вашего запроса (уменьшив количество прочитанных страниц), а также разрешить сканирование диапазона индексов (или, что бы он ни называл MySQL), для создания фактических данных.
Другой вариант - запустить запланированный (возможно, ночной?) процесс для создания данных для ваших "тяжелых" пользователей и использовать эти данные при показе отчетов.