UNIX_TIMESTAMP полевой раздел на целый год - PullRequest
0 голосов
/ 30 мая 2018

Я совершенно новый в теме разделов, и необходимость возникла из-за большого накопления данных.

Ну, по сути, это система контроля доступа, в настоящее время существует 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

1 Ответ

0 голосов
/ 30 мая 2018

Можно использовать разбиение по диапазону в целочисленном столбце.

Предполагая, что 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') )

Будьте осторожны с настройкой часового пояса сеанса.Эти литералы даты будут интерпретироваться как значения в текущем часовом поясе ... например, если вы хотите, чтобы они были в формате UTC datetime, time_zone должно быть +00: 00.

Или замените выражение UNIX_TIMESTAMP () литераломцелочисленное значение ... это то, что MySQL собирается делать с выражениями UNIX_TIMESTAMP ().

Очевидно, что вы можете называть разделы как угодно.


Примечание: для применения разбиения к существующей таблице MySQL потребует создания полной копии table, удерживая эксклюзивную блокировку на исходном столе, пока операция завершается.Таким образом, вам понадобится достаточно места на диске (диске) и время для завершения операции.

Можно создать новую таблицу, которая разбита на разделы, а затем скопировать более старые данные за раз.,Но сделайте куски разумного размера, чтобы избежать раздувания ibdata1 с большими транзакциями.А затем выполните несколько операторов RENAME TABLE, чтобы переместить старую таблицу и переместить новую таблицу.

Некоторые предостережения, которые следует отметить с многораздельными таблицами: нет поддержки внешнего ключа и нет гарантии, что многораздельная таблица дастлучшая производительность DML, чем у однораздельных таблиц.

Стратегические индексы и тщательно спланированные запросы - ключ к производительности с «очень большими» таблицами.И это верно и для секционированных таблиц.

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

Что касается создания подразделов внутри разделов, я бы не рекомендовал это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...