2015-02-08 5 views
0

У меня есть таблица, которая содержит данные на 50 ГБ, теперь я пытаюсь разбить столбец datetime ниже, это детали.как разбить таблицу в столбце non primary key (MYSQL)

CREATE TABLE EDR2 (id varchar(255),appKey varchar(255),clickedTime datetime ,ettId bigint(20),primary key(id),Key `ettId` (ettId),Key `clickedTime_index` (`clickedTime`)) 
PARTITION BY RANGE (day(clickedTime)) 
(PARTITION p01 VALUES LESS THAN (2) , 
PARTITION p02 VALUES LESS THAN (3) , 
PARTITION p03 VALUES LESS THAN (4) , 
PARTITION p04 VALUES LESS THAN (5) , 
PARTITION p05 VALUES LESS THAN (6) , 
PARTITION p06 VALUES LESS THAN (7) , 
PARTITION p07 VALUES LESS THAN (8) , 
PARTITION p08 VALUES LESS THAN (9) , 
PARTITION p09 VALUES LESS THAN (10) , 
PARTITION p10 VALUES LESS THAN (11) , 
PARTITION p11 VALUES LESS THAN (12) , 
PARTITION p12 VALUES LESS THAN (13) , 
PARTITION p13 VALUES LESS THAN (14) , 
PARTITION p14 VALUES LESS THAN (15) , 
PARTITION p15 VALUES LESS THAN (16) , 
PARTITION p16 VALUES LESS THAN (17) , 
PARTITION p17 VALUES LESS THAN (18) , 
PARTITION p18 VALUES LESS THAN (19) , 
PARTITION p19 VALUES LESS THAN (20) , 
PARTITION p20 VALUES LESS THAN (21) , 
PARTITION p21 VALUES LESS THAN (22) , 
PARTITION p22 VALUES LESS THAN (23) , 
PARTITION p23 VALUES LESS THAN (24) , 
PARTITION p24 VALUES LESS THAN (25) , 
PARTITION p25 VALUES LESS THAN (26) , 
PARTITION p26 VALUES LESS THAN (27) , 
PARTITION p27 VALUES LESS THAN (28) , 
PARTITION p28 VALUES LESS THAN (29) , 
PARTITION p29 VALUES LESS THAN (30) , 
PARTITION p30 VALUES LESS THAN (31) , 
PARTITION p31 VALUES LESS THAN MAXVALUE);* 

и я получаю сообщение об ошибке: -

***ERROR 1503 (HY000): A PRIMARY KEY must include all columns in the table's partitioning function*** 

Я не могу создать составной первичный ключ (ид, clickedTime) и не может удалить первичный ключ, так как это позволит duplicate records, Я не хочу ничего менять в своем коде. , пожалуйста, предложите.

+1

Хммм. Вы не можете разбивать столбец, если он не является частью первичного ключа (и всех других уникальных ограничений). Следовательно, вы не можете делать то, что хотите. Вы можете просмотреть документацию по этому адресу: http://dev.mysql.com/doc/refman/5.7/en/partitioning-limitations-partitioning-keys-unique-keys.html. –

+0

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

+0

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

ответ

1

Любой ключ UNIQUE на секционированной таблице должен включать ключ раздела, поскольку в противном случае ограничение UNIQUEness было бы больно дорогостоящим. Каждому INSERT пришлось бы проверить все разделы, чтобы убедиться, что ограничение не нарушено.

Учитывая, что PARTITIONing обычно полезен только на очень больших таблицах, эти накладные расходы будут смертельными.

Вы разбиваете на день месяца - Почему? Что вы надеетесь получить? Проверка «диапазона» на clickedTime не будет «обрезкой раздела» (я думаю). См. EXPLAIN PARTITIONS SELECT ...

Что такое идентификатор, например, для VARCHAR (255)? Большие ОСНОВНЫЕ КЛЮЧИ обычно непрактичны.

Это таблица MyISAM или InnoDB?

Я рекомендую избавиться от разбиения.

Что такое SELECT? В настоящее время я не вижу составных INDEX, обычно разумно иметь составной индекс , заканчивающийся с DATETIME.

+0

Мне нужно сохранить только данные за 60 дней на живой таблице, поэтому я хочу повернуть последний 60-дневный раздел, поэтому я пытаюсь разбить на день месяца. Также я не могу создать первичный ключ или уникальный ключ в столбце datetime. Также размер столбца идентификатора устанавливается по умолчанию (JPA). –

+0

Размер столбца ID задается каркасом? Я должен добавить это к моему длинному списку того, почему стороннее программное обеспечение болит столько, сколько оно помогает.

+0

Вы дошли до того, что удалили данные, возраст которых превышает 60 дней? У вас может быть грубый сюрприз - он будет медленно удалять половину раздела. С «PARTITION BY RANGE» это мгновенно, используя «DROP PARTITION». И _that_ - хорошая причина использовать «PARTITION», но только «BY RANGE». –