На днях мне пришлось заняться разметкой.
Каждый день в таблицу будет добавляться миллион записей, и ожидается, что эти записи будут использоваться для предоставления различных отчетов и графиков.
Скажу сразу, делаю это не первый раз; до этого я успешно разбил сайт с помощью Битрикса вот так: Шаг 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
-
Сколько Информации Вы Храните В Dropbox?
19 Oct, 24 -
Эпидемия В Данных
19 Oct, 24 -
Pwa — Это Просто. Привет Хабр
19 Oct, 24