Я совершенно новый в теме разделов, и необходимость возникла из-за большого накопления данных.
Ну, в основном это система контроля доступа, в настоящее время существует 20 отделов, и каждый отдел насчитывает около 100 пользователей. Система записывает дату и время записей и выходов (from_date/to_date). Мое намерение состоит в разделении по отделам, а затем в течение месяца в течение года.
План:
Разделите таблицу на [ dep_id и date (from_date и to_date)]
проблема
У меня есть следующая таблица.
CREATE TABLE 'employee' (
'employee_id' smallint(5) NOT NULL,
'dep_id' int(11) NOT NULL,
'from_date' int(11) NOT NULL,
'to_date' int(11) NOT NULL,
KEY 'index1' ('employee_id','from_date','to_date')
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
У меня есть даты (from_date и to_date) в формате UNIX_TIMESTAMP (INT 11). Я хочу разделить его в течение всех месяцев года. Возможно?
Mysql - 5,7
Можно использовать разбиение диапазонов на целочисленный столбец.
Предполагая, что my_int_col
является целым числом в стиле unix с 1970-01-01
мы могли бы достичь ежемесячных разделов с чем-то вроде этого:
PARTITION BY RANGE (my_int_col)
( PARTITION p20180101 VALUES LESS THAN ( UNIX_TIMESTAMP('2018-01-01 00:00') )
, PARTITION p20180201 VALUES LESS THAN ( UNIX_TIMESTAMP('2018-02-01 00:00') )
, PARTITION p20180301 VALUES LESS THAN ( UNIX_TIMESTAMP('2018-03-01 00:00') )
, PARTITION p20180401 VALUES LESS THAN ( UNIX_TIMESTAMP('2018-04-01 00:00') )
, PARTITION p20180501 VALUES LESS THAN ( UNIX_TIMESTAMP('2018-05-01 00:00') )
, PARTITION p20180601 VALUES LESS THAN ( UNIX_TIMESTAMP('2018-06-01 00:00') )
Будьте осторожны с настройкой time_zone сеанса. Эти литераторы даты будут интерпретироваться как значения в текущем time_zone... например, если вы хотите, чтобы они были датами UTC, time_zone должен быть +00: 00.
Или замените выражение UNIX_TIMESTAMP() на значение буквального целого... что MySQL будет делать с выражениями UNIX_TIMESTAMP().
Очевидно, вы можете назвать разделы, что хотите.
Примечание. Применение разбиения на существующую таблицу потребует от MySQL создания целой копии таблицы с сохранением исключительной блокировки исходной таблицы во время выполнения операции. Таким образом, вам понадобится достаточное пространство для хранения (диска) и окно времени для завершения операции.
Можно создать новую таблицу, которая будет разбита на разделы, а затем скопировать старые данные на кусок за раз. Но сделайте куски разумно рассчитанными, чтобы избежать взлета ibdata1 с большими транзакциями. Затем выполните некоторые инструкции RENAME TABLE, чтобы переместить старую таблицу и переместите новую таблицу.
Некоторые оговорки, которые следует учитывать при использовании секционированных таблиц: нет поддержки внешнего ключа, и нет гарантии, что секционированная таблица даст лучшую производительность DML, чем неразделенная таблица.
Стратегические индексы и тщательно спланированные запросы являются ключом к производительности с "очень большими" таблицами. И это верно и для секционированных таблиц.
Разделение - это не волшебная пуля для проблем с производительностью, которые некоторым новичкам это хотелось бы.
Что касается создания дочерних разделов внутри разделов, я бы не рекомендовал его.