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

Нужна помощь с партицированием в MySQL?

Доброго дня!

Достался мне проект некоторой базу данных логов, получаемых с очень старых серверов.
Реализация была на базах MS Access. То есть, был набор баз данных, каждая база данных содержала одну таблицу в которой содержались данные логов с одного из серверов. По каждому серверу своя БД. Но так же базы данных разделялись по годам и полугодиям. Названия примерно следующим образом сформировано: сервер_год_полугодие (srv1_2020_1 или srv2_2020_2). И потом была БД и формами, которое позволяли по сети просматривать эти логи из этих баз.

Суть вопроса.
Хочу всё это безобразие переписать в виде некоторых веб-страниц. И если внешний вид я более менее представляю, и как должна работать логика - тоже.
Но вот упёрся в то, как должна работать бд.
Таблицы везде одного размера. Что-то типа id, datetime, text, etc.

Была мысль воспроизводить таблицы по тому же принципу, что и раньше, то есть куча таблиц вида сервер_год_полугодие. Но мне подсказали про партицирование.

Вопрос такой, хотелось бы организовать в MySQL партицирование (если такой вариант возможен) следующего вида: год -> месяц -> сервер

Я смог добиться только варианта, либо год -> месяц, либо год -> сервер.

Пример кода (год месяц):
spoiler

CREATE TABLE aaa (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    server INT(1) UNSIGNED NOT NULL,
    logDate DATETIME NOT NULL,
    INDEX id (id)
)
PARTITION BY RANGE( YEAR(logDate) )
SUBPARTITION BY HASH( MONTH(logDate) )
SUBPARTITIONS 12 (
  PARTITION y20 VALUES LESS THAN (2020),
  PARTITION y21 VALUES LESS THAN (2021),
  PARTITION y22 VALUES LESS THAN (2022),
  PARTITION yNext VALUES LESS THAN MAXVALUE
);



Пример кода (год сервер):
spoiler

CREATE TABLE bbb (
    id INT UNSIGNED NOT NULL AUTO_INCREMENT,
    server INT(1) UNSIGNED NOT NULL,
    logDate DATETIME NOT NULL,
    INDEX id (id)
)
PARTITION BY RANGE (YEAR(logDate))
SUBPARTITION BY KEY(server)
SUBPARTITIONS 3 (
    PARTITION y2020 VALUES LESS THAN (2021) (
        SUBPARTITION srv0_2020,
        SUBPARTITION srv1_2020,
        SUBPARTITION srv2_2020
    ),
    PARTITION y2021 VALUES LESS THAN (2022) (
        SUBPARTITION srv0_2021,
        SUBPARTITION srv1_2021,
        SUBPARTITION srv2_2021
    ),
    PARTITION y2022 VALUES LESS THAN (2023) (
        SUBPARTITION srv0_2022,
        SUBPARTITION srv1_2022,
        SUBPARTITION srv2_2022
    )
);



Благодарю за любую помощь
  • Вопрос задан
  • 81 просмотр
Подписаться 2 Средний Комментировать
Решения вопроса 1
@galaxy
По-моему, там максимум два уровня (партиции и субпартиции).

Можете, в конце концов, сделать RANGE партиции по дате на уровне месяца (и субпартиции по серверу):
PARTITION BY RANGE COLUMNS(datetime) (
    PARTITION 2019_01 VALUES LESS THAN ('2019-02-01'),
    PARTITION 2019_02 VALUES LESS THAN ('2019-03-01'),
    ...
);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

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