Несколько предложений.
Вы, вероятно, собираетесь запускать агрегированные запросы по этому материалу, поэтому после (или во время) загрузки данных в свои таблицы вы должны предварительно агрегировать данные, например предварительно вычислить итоги по часам, по пользователям или по неделе, как бы то ни было, вы поняли идею и сохраните ее в кэш-таблицах, которые вы используете для своих графиков отчетов. Если вы можете уменьшить свой набор данных на порядок, то это хорошо для вас!
Это означает, что я буду получать некоторые данные с интервалом, используя временные метки.
Значит, вы используете данные только за последние X дней?
Удаление старых данных из таблиц может быть ужасно медленным, если вам нужно удалить несколько десятков миллионов строк, для этого отлично подходит секционирование (просто удалите этот старый раздел). Он также группирует все записи за один и тот же период времени близко друг к другу на диске, что намного эффективнее кэширует.
Теперь, если вы используете MySQL, я настоятельно рекомендую использовать таблицы MyISAM. Вы не получаете отказоустойчивости или транзакций, а блокировка глупа, но размер таблицы намного меньше, чем у InnoDB, а это значит, что она может поместиться в ОЗУ, что означает гораздо более быстрый доступ.
Поскольку большие агрегаты могут включать в себя множество довольно последовательных дисковых операций ввода-вывода, быстрая система ввода-вывода, такая как RAID10 (или SSD), является плюсом.
Можно ли как-то оптимизировать таблицу или запрос, чтобы вы могли выполнять эти запросы за разумное время?
Это зависит от таблицы и запросов; не могу дать совет, не зная больше.
Если вам нужны сложные отчетные запросы с большими агрегатами и соединениями, помните, что MySQL не поддерживает никаких причудливых JOIN, или хеш-агрегатов, или чего-либо еще действительно полезного, в основном единственное, что он может сделать, это индексное сканирование вложенного цикла, которое хорошо на кэшированная таблица, и абсолютно ужасен в других случаях, если задействован некоторый произвольный доступ.
Я предлагаю вам протестировать с Postgres. Для больших агрегатов более умный оптимизатор работает хорошо.
Пример :
CREATE TABLE t (id INTEGER PRIMARY KEY AUTO_INCREMENT, category INT NOT NULL, counter INT NOT NULL) ENGINE=MyISAM;
INSERT INTO t (category, counter) SELECT n%10, n&255 FROM serie;
(серия содержит 16M строк с n = 1 .. 16000000)
MySQL Postgres
58 s 100s INSERT
75s 51s CREATE INDEX on (category,id) (useless)
9.3s 5s SELECT category, sum(counter) FROM t GROUP BY category;
1.7s 0.5s SELECT category, sum(counter) FROM t WHERE id>15000000 GROUP BY category;
В простом запросе, таком как этот, pg примерно в 2-3 раза быстрее (разница была бы намного больше, если бы использовались сложные соединения).
person
bobflux
schedule
30.04.2011