Оптимизация большой таблицы mysql, правильно ли?

Есть большая таблица history, ежедневно добавляется 1+ млн строк. Делать выборку из одной таблицы очень ресурсозатратно и запросы выборки данных для определенного юзера за определенный интервал времени идут долго. Я думаю сделать разбиение таблиц по дням history_день_месяц_год, и промежуточную таблицу с днями когда юзера есть история за дни, чтобы не перебирать все таблицы, а только за те дни, когда записывалась история. Насколько имеет смысл партицирование в данной ситуации? Ведь иначе таблица будет увеличиваться до той поры, пока сервер уже совсем не справится с нагрузкой. Какие есть варианты решения?
  • Вопрос задан
  • 438 просмотров
Решения вопроса 1
@Vitsliputsli
Базы данных для того и создавались чтобы работать с большим объемом данных. 1 млн строк в день вполне нормальная работа. Весь вопрос как вы работаете с базой.

может индексы?

для базы в миллиарды строк я думаю это не очень спасет ситуацию.

Почему вы так решили? Создавайте индексы, их вполне достаточно для большинства задач. если работает медленно, показывайте запрос и план.

Только если вы проводите серьезную аналитику по большому количеству данных, тогда стоит задумываться о колоночных БД.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
dimonchik2013
@dimonchik2013
...а ну-ка пыль сдуй отсюда...
чем clickhouse не угодил? копируй в него и не жужжи
Ответ написан
@paldraken
Используйте партиционирование (partitioning).
Это как раз и есть способ разбиения разбиения большой таблицы на логические части по определенным критериям. В вашем случае это будет поле дата. Например:
CREATE TABLE employees (
    id INT NOT NULL,
    fname VARCHAR(30),
    lname VARCHAR(30),
    hired DATE NOT NULL DEFAULT '1970-01-01',
    separated DATE NOT NULL DEFAULT '9999-12-31',
    job_code INT,
    store_id INT
)
PARTITION BY RANGE ( YEAR(separated) ) (
    PARTITION p0 VALUES LESS THAN (1991),
    PARTITION p1 VALUES LESS THAN (1996),
    PARTITION p2 VALUES LESS THAN (2001),
    PARTITION p3 VALUES LESS THAN MAXVALUE
);

Пример отсюда
Впрочем миллион строк это действительно немного и возможно стоить начать с индексов
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы