Из соображений производительности я хотел бы разбить таблицу, которая у меня есть, на основе поля 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)
);