Разделение И Боль Mysql

На днях мне пришлось заняться разметкой.

Каждый день в таблицу будет добавляться миллион записей, и ожидается, что эти записи будут использоваться для предоставления различных отчетов и графиков.

Скажу сразу, делаю это не первый раз; до этого я успешно разбил сайт с помощью Битрикса вот так: Шаг 1. Удалите AUTO INCREMENT из таблицы b_iblock_element.

ALTER TABLE b_iblock_element MODIFY ID INT(11) NOT NULL
Шаг 2. Удалите ПЕРВИЧНЫЙ ключ из таблицы.

ИЗМЕНИТЬ ТАБЛИЦУ b_iblock_element УДАЛИТЬ ПЕРВИЧНЫЙ КЛЮЧ
Шаг 3. Создайте новый ПЕРВИЧНЫЙ КЛЮЧ, который будет содержать предыдущий ключ и IBLOCK_ID, который используется для разделения.

ALTER TABLE b_iblock_element ДОБАВИТЬ ОГРАНИЧЕНИЕ id_iblock_id ПЕРВИЧНЫЙ КЛЮЧ (ID,IBLOCK_ID)
Шаг 4. Верните АВТОИНКРЕМЕНТ.

ALTER TABLE b_iblock_element MODIFY ID INT(11) NOT NULL AUTO_INCREMENT
Шаг 5. Наконец, делаем это, разделив на 10 частей.

ALTER TABLE b_iblock_element РАЗДЕЛЕНИЕ ПО ХЕШУ (IBLOCK_ID) РАЗДЕЛЫ 10;
Это довольно просто.

Функция, используемая для разделения, может содержать ключи, но все эти ключи должны находиться в PRIMARY KEY. Теперь мне пришлось разбить еще одну таблицу, и мне хотелось разбить ее сразу на 2 поля: по типу и дате.

Более того, мне хотелось разбить дату на месяцы и хранить данные не более года.

Шаг 1. Первое, с чем я столкнулся, это то, что мне пришлось удалить все внешние ключи.

Mysql не работает с ними при секционировании.

ALTER TABLE table_name DROP CONSTRAINT fk_key_name
Шаг 2. Мне пришлось изменить поле отметки времени на дату и время.

Временная метка MySQL ругалась

ОШИБКА 1486 (HY000): постоянные, случайные выражения или выражения, зависящие от часового пояса, в функции (под)секционирования не допускаются.

ALTER TABLE table_name CHANGE `date` `date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP;
Шаг 3. Мне пришлось добавить поля даты и типа в ПЕРВИЧНЫЙ КЛЮЧ.

Шаг 4. Я решил использовать подразделы для разделения на два поля.

ALTER TABLE table_data РАЗДЕЛ ПО СПИСКУ (МЕСЯЦ(`дата`)) ПОДРАЗДЕЛЕНИЕ ПО ХЕШУ(`type_id`) ПОДРАЗДЕЛЕНИЯ 10 ( РАЗДЕЛ p1 ЗНАЧЕНИЯ В (1), РАЗДЕЛ p2 ЗНАЧЕНИЯ В (2), РАЗДЕЛ p3 ЗНАЧЕНИЯ В (3), РАЗДЕЛ p4 ЗНАЧЕНИЯ В (4), РАЗДЕЛ p5 ЗНАЧЕНИЯ В (5), РАЗДЕЛ p6 ЗНАЧЕНИЯ В (6), РАЗДЕЛ p7 ЗНАЧЕНИЯ В (7), РАЗДЕЛ p8 ЗНАЧЕНИЯ В (8), РАЗДЕЛ p9 ЗНАЧЕНИЯ В (9), РАЗДЕЛ p10 ЗНАЧЕНИЯ В (10), РАЗДЕЛ p11 ЗНАЧЕНИЯ В (11), РАЗДЕЛ p12 ЗНАЧЕНИЯ В (12) );
Но даже если MySQL поддерживает функцию МЕСЯЦА для разделения и я использую LIST/RANGE вместе с HASH/KEY, то есть MySQL поддерживает подразделы только на этом уровне, у меня ничего не получалось.

Команда объяснения разделов запроса показала, что когда я выбираю интервал по дате, используются все разделы.

Гугл сказал мне что я не могу использовать функцию МЕСЯЦ, а только функции TO_DAYS, YEAR и TO_SECONDS. Мне все равно пришлось сделать разделы статическими:

ALTER TABLE table_data PARTITION BY RANGE(to_days(`date`)) ПОДРАЗДЕЛЕНИЕ ПО ХЕШУ(`type_id`) ПОДРАЗДЕЛЕНИЯ 10 ( РАЗДЕЛ p01 ЗНАЧЕНИЯ МЕНЬШЕ (to_days('2015-10-01')), РАЗДЕЛ p02 ЗНАЧЕНИЯ МЕНЬШЕ (to_days('2015-11-01')), РАЗДЕЛ p03 ЗНАЧЕНИЯ МЕНЬШЕ (to_days('2015-12-01')), РАЗДЕЛ p04 ЗНАЧЕНИЯ МЕНЬШЕ (to_days('2016-01-01')), РАЗДЕЛ p05 ЗНАЧЕНИЯ МЕНЬШЕ (to_days('2016-02-01')), РАЗДЕЛ p06 ЗНАЧЕНИЯ МЕНЬШЕ (to_days('2016-03-01')), РАЗДЕЛ p07 ЗНАЧЕНИЯ МЕНЬШЕ (to_days('2016-04-01')), РАЗДЕЛ p08 ЗНАЧЕНИЯ МЕНЬШЕ (to_days('2016-05-01')), РАЗДЕЛ p09 ЗНАЧЕНИЯ МЕНЬШЕ (to_days('2016-06-01')), РАЗДЕЛ p10 ЗНАЧЕНИЯ МЕНЬШЕ (to_days('2016-07-01')), РАЗДЕЛ p11 ЗНАЧЕНИЯ МЕНЬШЕ (to_days('2016-08-01')), РАЗДЕЛ p12 ЗНАЧЕНИЯ МЕНЬШЕ (to_days('2016-09-01')), РАЗДЕЛ p13 ЗНАЧЕНИЯ МЕНЬШЕ (to_days('2016-10-01')), РАЗДЕЛ p14 ЗНАЧЕНИЯ МЕНЬШЕ (to_days('2016-11-01')), РАЗДЕЛ p15 ЗНАЧЕНИЯ МЕНЬШЕ (to_days('2016-12-01')), РАЗДЕЛ p16 ЗНАЧЕНИЯ МЕНЬШЕ (to_days('2017-01-01')), РАЗДЕЛ p18 ЗНАЧЕНИЯ МЕНЬШЕ (to_days('2017-02-01')), РАЗДЕЛ p19 ЗНАЧЕНИЯ МЕНЬШЕ (to_days('2017-03-01')), РАЗДЕЛ p20 ЗНАЧЕНИЯ МЕНЬШЕ (to_days('2017-04-01')), РАЗДЕЛ pmaxval ЗНАЧЕНИЯ МЕНЬШЕ, ЧЕМ MAXVALUE );
Команда объяснения разделов наконец-то показала, что не будет использовать кучу таблиц.

Надеюсь, это сработает, и спасибо MySQL за эту боль.

Теги: #Разделы MySQL #MySQL

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.