MySQL десятки миллионов разделов таблицы данных практическое применение

MySQL

В настоящее время таблица статистики системы увеличивается на 20 Вт данных в день.Хотя данные за более чем 3 месяца были сброшены в другие места, в таблице все еще есть около 2 кВт данных, а емкость около 2 Гб.

Таблица Stat была проиндексирована.Если вы напрямую выберете ... где ... предел, скорость по-прежнему очень высока, но как только она включает группировку по страницам, она станет очень медленной.

Замечено, что группировка в течение 7 дней занимает около 35-50 секунд. Операция отражает крайне недружественный опыт. Поэтому я искал схему разбиения MySQL в Интернете. Я обнаружил, что в основном все онлайн систематически объясняют концепцию и тип раздела, а также некоторые экспериментальные эффекты, которые не близки к реальному бою.

Если обратиться к руководству по MySQL и моим собственным исследованиям, в текущей системе наконец-то реализовано разделение, потому что оно записывается.

Выбор типа раздела

Сама таблица Stat является статистическим отчетом, поэтому ее данные хранятся по дате, а горячие данные обычно ограничены текущим днем ​​и в пределах 7 дней. Поэтому я выбрал тип Range для разбиения.

Создать раздел для текущей таблицы

Поскольку необходимо преобразовать существующую таблицу, можно использовать только метод alter:

ALTER TABLE stat
    PARTITION BY RANGE(TO_DAYS(dt)) (
        PARTITION p0 VALUES LESS THAN(0),
        PARTITION p190214 VALUES LESS THAN(TO_DAYS('2019-02-14')),
        PARTITION pm VALUES LESS THAN(MAXVALUE)
    );

Здесь нужно отметить 2 момента:

Один из них является раздел P0. Это связано с тем, что MySQL (я версия 5.7) имеет ошибку, то есть независимо от того, какую область вы проверяете данные, она сканирует первую область. Есть сотни тысяч данных в каждой области , Это очень больно сканировать, поэтому для того, чтобы избежать ненужного сканирования, просто получите раздел данных 0.

Второй — это раздел pm, который является самым большим разделом. Если вы не хотите приходить в личку, то данные, которые вы сохранили 15.02.2019, сообщат об ошибке. Таким образом, pm на самом деле является зарезервированным разделом для будущих данных.

Регулярно расширяйте раздел

Поскольку разделы MySQL не могут динамически расширяться сами по себе, нам нужно написать для него код для динамического увеличения разделов.

Добавление разделов необходимо использоватьREORGANIZEкоманда, ее роль заключается в переназначении раздела. Например, завтра 15-е число, тогда мы должны добавить раздел к 15-му, что фактически разбивает раздел pm на 2 раздела:

ALTER TABLE stat
    REORGANIZE PARTITION pm INTO (
        PARTITION p190215 VALUES LESS THAN(TO_DAYS('2019-02-15')),
        PARTITION pm VALUES LESS THAN(MAXVALUE)
    );

Возникает вопрос, как получить все разделы текущей таблицы? В интернете много способов, но я попробовал и почувствовал, что первыйshow create table statТогда удобнее сопоставить все разделы с регулярными выражениями.

Периодически удалять разделы

Поскольку база данных становится все больше и больше, мы определенно хотим очистить старые данные, а также старые разделы. Это также проще:

ALTER TABLE stat DROP PARTITION p190214, p190215