Задать вопрос
@Vladbara705

Mysql партицирование. Как разделить таблицу по списку и дате?

Всем привет. Есть следующая таблица (упрощенная):

CREATE TABLE `routes` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`userId` int(11) NOT NULL,
`created` datetime NOT NULL,
`createdTimezoneOffset` smallint(6) NOT NULL DEFAULT '0',
`deleted` tinyint(1) DEFAULT '0',
 PRIMARY KEY (`id`,`created`,`archive`)
) ENGINE=InnoDB AUTO_INCREMENT=1014699 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci


Необходимо разделить таблицу следующим образом:

Раздел: Архив = 0
Подраздел: Год создания

Раздел: Архив = 1
Подраздел: Год создания

Делаю так:
ALTER TABLE routes PARTITION BY LIST (archive)
SUBPARTITION BY HASH (YEAR(created))
(
   PARTITION p0 VALUES IN (0)
   (
      SUBPARTITION s0,
      SUBPARTITION s1,
      SUBPARTITION s2,
      SUBPARTITION s3
   ),
   PARTITION p1 VALUES IN (1)
   (
      SUBPARTITION s4,
      SUBPARTITION s5,
      SUBPARTITION s6,
      SUBPARTITION s7
   )
);


И все вроде бы работает. Но когда делаю выборку по периоду поля created - читаются все разделы.
Пример:  EXPLAIN SELECT * FROM routes WHERE archive = 1 AND created >= '2020-01-01 00:00:00';

Исходя из документации - понимаю почему.
Как правильно разделить таблицу таким образом, чтобы запрос выше брал определенную часть таблицы ?
  • Вопрос задан
  • 73 просмотра
Подписаться 1 Средний 2 комментария
Решения вопроса 1
@Vladbara705 Автор вопроса
Решение найдено. Работает так, как надо, оставлю это здесь:

ALTER TABLE routes PARTITION BY RANGE COLUMNS (archive, created)
(
    PARTITION p0 VALUES LESS THAN (0, MAXVALUE),
    PARTITION p1 VALUES LESS THAN (1, '2019-01-01'),
    PARTITION p2 VALUES LESS THAN (1, '2020-01-01'),
    PARTITION p3 VALUES LESS THAN (1, '2020-06-01'),
    PARTITION p4 VALUES LESS THAN (1, MAXVALUE)
);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы