У нас есть две очень большие таблицы в нашей базе данных Mysql (MariaDb). Таблица_1 содержит карту «многие ко многим». Он имеет первичный ключ с автоинкрементом и составной ключ из двух столбцов.
Таблица_2 ссылается на первичный ключ таблицы_1. Мы не хотим исправлять эту очевидную ошибку в дизайне,
- Использовать составной первичный ключ для Table_1
- Добавить две колонки в Table_2
- Заполните составной ключ в Таблице_2, скопировав данные из Таблицы_1, и создайте для него индекс.
- Желательно удалить столбец автоинкрементного ключа из обеих таблиц.
Эти таблицы имеют ~ 300M строк, а таблицы имеют размер ~ 10GB. Мы должны сделать эти обновления в течение ~ 6 часов.
Я исследую, как сделать это эффективно, и делаю испытания на базе данных реплики. До сих пор я не пытался запускать что-либо с реальными данными, потому что обычных сценариев было бы недостаточно.
Я не опытный администратор БД. Поэтому мне нужно немного пролить свет, чтобы сделать это.
Мой вопрос: каков наилучший подход / советы, чтобы сделать это эффективно?
То, что я пытался до сих пор
Я читал о новой функции мгновенного добавления столбца , но наша производственная БД находится на версии 10.0 MariaDb, которая старше.
Я следовал предложениям в этом ответе и запускал скрипт ниже в последней версии БД с поддержкой мгновенного добавления столбцов (таблица изменения была мгновенной). В таблице было ~ 50 миллионов строк (1/6 оригинала). Это заняло около двух часов, что также исключает создание новых индексов. Поэтому этого будет недостаточно.
SET join_buffer_size = 4 * 50 * 1024 * 1024; -- 50M keys of 4 bytes each
SET optimizer_switch='mrr=on,mrr_cost_based=off,mrr_sort_keys=on,optimize_join_buffer_size=on';
SET join_cache_level = 8;
UPDATE TABLE_2
JOIN TABLE_1 ON TABLE_1_Id = TABLE_2_FKT1_Id
SET
TABLE_2_KeyPart_1 = TABLE_1_KeyPart_1,
TABLE_2_KeyPart_2 = TABLE_1_KeyPart_2
Также рассматривает возможность оценки этого инструмента
https://www.percona.com/doc/percona-toolkit/2.2/pt-online-schema-change.html