Как изменить и обновить большую таблицу, чтобы добавить столбцы составного ключа из другой таблицы - PullRequest
0 голосов
/ 23 января 2019

У нас есть две очень большие таблицы в нашей базе данных Mysql (MariaDb). Таблица_1 содержит карту «многие ко многим». Он имеет первичный ключ с автоинкрементом и составной ключ из двух столбцов. Таблица_2 ссылается на первичный ключ таблицы_1. Мы не хотим исправлять эту очевидную ошибку в дизайне,

  1. Использовать составной первичный ключ для Table_1
  2. Добавить две колонки в Table_2
  3. Заполните составной ключ в Таблице_2, скопировав данные из Таблицы_1, и создайте для него индекс.
  4. Желательно удалить столбец автоинкрементного ключа из обеих таблиц.

Эти таблицы имеют ~ 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

1 Ответ

0 голосов
/ 27 января 2019

План A: Используйте инструмент Percona: pt-online-schema-change.

План B: Используйте конкурирующий продукт: gh-ost.

План C: Не используйте UPDATE, чтоубийцаВместо этого перестройте таблицы (таблицы) простым способом, а затем используйте RENAME TABLE, чтобы заменить новую версию на место.

Разделение вряд ли поможет.Ссылка Даниэля помогает с длительным UPDATE, но заменяет время (это занимает больше времени) на инвазивность (что не является проблемой, потому что у вас есть окно обслуживания).

Еще некоторые подробности в плане C (которыйЯ предпочитаю это дело):

CREATE TABLE(s) ... -- with new names, and all the new features except secondary indexes
INSERT INTO new SELECT ... FROM old table(s)
RENAME TABLE real1 TO old1,
             new1 TO real1,
             real2 TO old2,
             new2 TO real2;
test -- you still undo the RENAME if necessary
DROP TABLE old1, old2;
...