ОШИБКА 1492 (HY000): Для разделов ДИАПАЗОНА необходимо определить каждый раздел

#mysql #innodb #partitioning

Вопрос:

Я пытаюсь создать секционированную таблицу, но получаю сообщение об ошибке

ОШИБКА 1492 (HY000): Для разделов ДИАПАЗОНА необходимо определить каждый раздел

Я что-то здесь упускаю. Запрос выглядит следующим образом:

 CREATE TABLE IF NOT EXISTS logdata (
    `timestamp` datetime NOT NULL,
    `device_id` int(11) NOT NULL,
    `row_id` int(11) NOT NULL,
    `value_0` DECIMAL(27,9) DEFAULT NULL, 
    `value_1` DECIMAL(27,9) DEFAULT NULL, 
    `value_2` DECIMAL(27,9) DEFAULT NULL, 
    `value_3` DECIMAL(27,9) DEFAULT NULL, 
    `value_4` DECIMAL(27,9) DEFAULT NULL, 
    `value_5` DECIMAL(27,9) DEFAULT NULL, 
    `value_6` DECIMAL(27,9) DEFAULT NULL, 
    `value_7` DECIMAL(27,9) DEFAULT NULL, 
    `value_8` DECIMAL(27,9) DEFAULT NULL, 
    `value_9` DECIMAL(27,9) DEFAULT NULL,
    PRIMARY KEY (`timestamp`,`device_id`,`row_id`),
    KEY `device_id_1_202004` (`device_id`),
    KEY `row_id_1_202004` (`row_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED 
PARTITION BY RANGE(TO_DAYS(`timestamp`)) 
SUBPARTITION BY HASH (`device_id`) PARTITIONS 2 
(
    PARTITION p2001xx VALUES LESS THAN (TO_DAYS('2001-01-01 00:00:00')) (
        SUBPARTITION s2001xxa, 
        SUBPARTITION s2001xxb
    ),
    PARTITION p202004 VALUES LESS THAN (TO_DAYS('2020-04-01 00:00:00')) (
        SUBPARTITION s202004a, 
        SUBPARTITION s202004b
    ),
    PARTITION pMax VALUES LESS THAN MAXVALUE (
        SUBPARTITION smaxa, 
        SUBPARTITION smaxb
    )
);
 

Комментарии:

1. Удалять PARTITIONS 2 . Или наоборот, удалите списки подразделов.

2. Подразделы, скорее всего, будут бесполезны. Разделение хэшей, скорее всего, будет бесполезным. Что вы надеетесь получить от разделения? (Производительность достигается редко .)

Ответ №1:

Если вы укажете количество подразделов, то используйте SUBPARTITIONS 2 , не PARTITIONS 2 :

 ...
PARTITION BY RANGE(TO_DAYS(`timestamp`)) 
SUBPARTITION BY HASH (`device_id`) SUBPARTITIONS 2 
(
...
 

Если вы явно назовете подразделы, то вам не обязательно строго SUBPARTITIONS 2 :

 ...
PARTITION BY RANGE(TO_DAYS(`timestamp`)) 
SUBPARTITION BY HASH (`device_id`)
(
    PARTITION p2001xx VALUES LESS THAN (TO_DAYS('2001-01-01 00:00:00')) (
        SUBPARTITION s2001xxa, 
        SUBPARTITION s2001xxb
    ),
    PARTITION p202004 VALUES LESS THAN (TO_DAYS('2020-04-01 00:00:00')) (
        SUBPARTITION s202004a, 
        SUBPARTITION s202004b
    ),
    PARTITION pMax VALUES LESS THAN MAXVALUE (
        SUBPARTITION smaxa, 
        SUBPARTITION smaxb
    )
);