разбиение mysql по дате

Я пытаюсь создать раздел в mysql в столбце даты MV_DATE имеет тип DATE

Вот запрос -

ALTER TABLE table_name PARTITION BY RANGE (TO_DAYS(MV_DATE))(PARTITION p0 VALUES LESS THAN (TO_DAYS('2015-08-31')));

Я получаю сообщение об ошибке A PRIMARY KEY must include all columns in the table's partitioning function

MV_DATE не является первичным ключом моей таблицы.

Я также пробовал ALTER TABLE JOB_VOL_SWH PARTITION BY RANGE ((MV_DATE))(PARTITION p0 VALUES LESS THAN (TO_DAYS('2015-08-31')));, что выдает ошибку ERROR 1659 (HY000): Field 'JB_DATE' is of a not allowed type for this type of partitioning

Я пробовал несколько вариантов, но, похоже, ни один из них не работает.

Есть ли особый способ создать разбиение по диапазонам дат? Таблица MYSQL содержит около миллиарда строк данных, что в значительной степени означает, что мои запросы вообще не возвращаются (практически). Следовательно, ищем разделение таблиц.


person usert4jju7    schedule 21.03.2016    source источник


Ответы (1)


19.6.1 Разделение ключей, первичных ключей и уникальных ключей

В этом разделе обсуждается связь ключей разделения с первичными и уникальными ключами. Правило, регулирующее эту связь, может быть выражено следующим образом: все столбцы, используемые в выражении разделения для многораздельной таблицы, должны быть частью каждого уникального ключа, который может иметь таблица.

Другими словами, каждый уникальный ключ в таблице должен использовать каждый столбец в выражении разделения таблицы. (Это также включает первичный ключ таблицы, поскольку он по определению является уникальным ключом. Этот конкретный случай обсуждается позже в этом разделе.) Например, каждый из следующих операторов создания таблицы недействителен:

Ссылка:

https://dev.mysql.com/doc/refman/5.7/en/partitioning-limitations-partitioning-keys-unique-keys.html.

person Dylan Su    schedule 21.03.2016
comment
Спасибо, Дилан. Столбец MV_DATE не может быть уникальным в моем случае. Ни один из столбцов в таблице не может быть уникальным, за исключением фиктивного первичного ключа, который представляет собой целое число с автоматическим приращением. Думаю, нет смысла в разделении с помощью этого, поскольку я не использую его ни в одном из своих запросов. Тогда нет другого способа разделить таблицу? - person usert4jju7; 21.03.2016
comment
Неправильный. AUTO_INCREMENT не должен быть сам по себе. PRIMARY KEY(id, mv_date) в порядке. Все, что нужно ИИ, - это найти MAX(id) при первом открытии стола; и этого PK для этого достаточно. Однако вы теряете чек на INSERTing дубликат id. Но этого никто никогда не делает. Подробнее о разбиении на разделы, особенно BY RANGE(TO_DAYS(..)). - person Rick James; 21.03.2016
comment
Рик прав. Неуникальный mv_date может быть добавлен в первичный ключ как составной первичный ключ. - person Dylan Su; 21.03.2016