Альтернативы разбиению по столбцу ENUM в MariaDB

Из соображений производительности я хотел бы разбить таблицу, которая у меня есть, на основе поля enum. Ожидается, что эта таблица будет содержать очень большой объем данных, и разбиение по этому столбцу enum имеет большой смысл с точки зрения приложения.

Вот минимальный пример того, что я пытаюсь сделать:

К сожалению, это не работает, потому что, насколько я понимаю, MariaDB не поддерживает разбиение по полю enum. Я получаю эту ошибку:

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

И вот какую ошибку я получил:

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

Я думал о добавлении целочисленного столбца partition_id и триггеров до вставки и до обновления, которые обновляют его в соответствии с полем enum, но я не уверен, что это хорошая идея из-за накладных расходов на производительность триггеров.

Как лучше всего это сделать?

P.S. Не уверен, что это уместно, но для контекста, resource_type (наряду со столбцом resource_id) используется для моделирования полиморфной связи в laravel.
Я использую версию 10.6.18-MariaDB-log MariaDB.

Заранее большое спасибо за ваш ответы.

DROP TABLE IF EXISTS test_performance_data;
CREATE TABLE test_performance_data
(
    id            INT AUTO_INCREMENT PRIMARY KEY,
    resource_type ENUM ('campaign', 'ad_group', 'ad_item', 'keyword')
)
    PARTITION BY LIST COLUMNS (resource_type) (
        PARTITION campaigns VALUES IN ('campaign'),
        PARTITION ad_groups VALUES IN ('ad_group'),
        PARTITION ad_items VALUES IN ('ad_item'),
        PARTITION keywords VALUES IN ('keyword')
        );
DROP TABLE IF EXISTS test_performance_data;

CREATE TABLE test_performance_data
(
    id            INT AUTO_INCREMENT PRIMARY KEY,
    resource_type ENUM ('campaign', 'ad_group', 'ad_item', 'keyword'),
    partition_id  INT GENERATED ALWAYS AS (
        CASE 
            WHEN resource_type = 'campaign' THEN 1
            WHEN resource_type = 'ad_group' THEN 2
            WHEN resource_type = 'ad_item' THEN 3
            WHEN resource_type = 'keyword' THEN 4
        END
    ) STORED
)
PARTITION BY LIST (partition_id) (
    PARTITION campaigns VALUES IN (1),
    PARTITION ad_groups VALUES IN (2),
    PARTITION ad_items VALUES IN (3),
    PARTITION keywords VALUES IN (4)
);
Ангелина
Вопрос задан15 июля 2024 г.

1 Ответ

Ваш ответ

Загрузить файл.