MySql - Изменить несколько таблиц одновременно - PullRequest
0 голосов
/ 25 ноября 2011

У меня есть MySql Db с таблицами innoDB.

Мне нужно изменить пару больших таблиц (~ 50M записей), так как изменение блокирует таблицы, я хочу сделать процесс максимально быстрым.

Что лучше всего с точки зрения скорости: 1. изменение одной таблицы за раз 2. изменение обеих таблиц одновременно (одновременно)

какие-либо идеи?

Ответы [ 3 ]

2 голосов
/ 26 ноября 2011

Я сделал тест.

Я создал таблицу с 4 миллионами строк. Очень простая таблица, один столбец и все значения «чувак» для всех строк. Затем я продублировал эту таблицу в big_2, содержащую те же данные.

Мой компьютер MacBook Pro 13,3 "с середины 2010 года, так что все связано с этим.

Затем я сделал три вещи.

  1. Я выполнил изменение в обеих таблицах последовательно, для добавления столбца потребовалось 34 и 33 секунды (всего 67 с).
  2. Я запустил alter для обеих таблиц в параллели, прошло 1,1 минуты, прежде чем они вернулись (в основном в одно и то же время) (всего 61 с)
  3. Я переделал первый тест, и на этот раз это заняло 35 + 35 секунд (всего 70)

Это подтверждает моё подозрение, что параллельно не будет быстрее. Наиболее вероятная причина заключается в том, что это почти полностью операция на диске, и она вообще не может быть параллельной.

0 голосов
/ 26 ноября 2011

На самом деле зависит от того, сколько памяти у вас на сервере.

Когда вы делаете ALTER TABLE, вы действительно хотите, чтобы таблица и ее самый большой вторичный индекс (помните, что кластеры innodb первичный ключ, поэтому PKхранится со строками), чтобы вписаться в память.Если этого не произойдет, это будет медленно (примечание: в этом обсуждении предполагается, что таблица не разбита на разделы).

Поскольку в вашей таблице есть крошечные 50M строк, скорее всего, она подходитв ОЗУ тривиально (у вас на сервере 32G +, верно?) со всеми его вторичными индексами.

Если все это вписывается в пул буферов innodb, делайте их параллельно.Если он не выполняет их последовательно.

Попробуйте на своем сервере разработки, который имеет те же характеристики, что и производственный (очевидно, настройте их с тем же размером innodb_buffer_pool)

0 голосов
/ 25 ноября 2011

Делая это одновременно, вы не получите большого выигрыша. Еще нужно дождаться окончания первого, чтобы сделать второй.

Вы можете предпочесть выполнять запросы с небольшой задержкой между ними, чтобы другие запросы, которые ожидали блокировки с начала первого обновления, также не ожидали второго. Например, если ваша база данных обслуживает веб-сайт, два 15-секундных зависания лучше, чем один 30-секундный.

...