Для меня есть две вещи, которые вы можете сделать,
Горизонтальное разбиение таблицы на основе столбца даты
Используйте концепцию предварительной агрегации.
Pre-агрегация:
В preagg у вас будет таблица «logs», таблица «logs_temp», таблица «logs_summary» и таблица «logs_archive». Структура журналов и таблицы logs_temp идентична. Поток приложений будет таким: все журналы заносятся в таблицу журналов, а затем каждый час запускается задание cron, которое выполняет следующие действия:
а. Скопируйте данные из таблицы журналов в таблицу «logs_temp» и очистите таблицу журналов. Это можно сделать с помощью трюка с Shadow Table.
б. Объедините журналы за определенный час из таблицы logs_temp
с. Сохранить агрегированные результаты в сводной таблице
* * 1 022 д. Скопируйте записи из таблицы logs_temp в таблицу logs_archive, а затем очистите таблицу logs_temp.
Таким образом, результаты предварительно агрегируются в сводной таблице.
Всякий раз, когда вы хотите выбрать результат, вы должны выбрать его из сводной таблицы.
Таким образом, выбор выполняется очень быстро, потому что количество записей намного меньше, поскольку данные предварительно агрегированы в час. Вы можете даже увеличить порог с часа до дня. Все зависит от ваших потребностей.
Теперь вставки тоже будут быстрыми, поскольку объем данных в таблице журналов невелик, поскольку он содержит данные только за последний час, поэтому восстановление индекса на вставках займет очень меньше времени по сравнению с очень большими данными. -set, следовательно, делает вставки быстрыми.
Вы можете узнать больше о трюке с Shadow Table здесь
Я использовал метод предварительной агрегации на новостном сайте, построенном на WordPress. Мне пришлось разработать плагин для новостного сайта, который бы отображал недавно популярные (популярные за последние 3 дня) новостные выпуски, и их было около 100 тыс. Обращений в день, и эта предварительная агрегация действительно очень помогла нам. Время запроса сократилось с более чем 2 секунд до менее секунды. Я собираюсь сделать плагин общедоступным в ближайшее время.