Необходимо думать о требованиях немного более тщательно.
На самом простом уровне, "самый быстрый" способ изменить таблицу состоит в том, чтобы выполнить в нем как можно меньше ALTER TABLE
операторы, предпочтительно один. Это вызвано тем, что MySQL копирует данные таблицы для изменения схемы и внесения пятнадцати изменений, пока делают единственную копию, очевидно (и действительно), быстрее, чем копирование таблицы пятнадцать раз, внося одно изменение за один раз.
, Но я подозреваю, что Вы спрашиваете, как сделать это изменение с наименьшим количеством суммы времени простоя. Путем я сделал бы это, Вы в основном синтезируете способ, которым работал бы неблок ALTER TABLE
. Но это имеет некоторые дополнительные требования:
AUTO_INCREMENT
поле для первого. , основная техника - как Вы предположили, т.е. использование INSERT INTO ... SELECT ...
. По крайней мере, Вы впереди, потому что Вы запускаете с таблицы InnoDB, таким образом, эти SELECT
не заблокируется. Я рекомендую делать ALTER TABLE
на новой, пустой таблице, которая сохранит MySQL, копируя все данные снова, которые будут означать, что необходимо перечислить все поля правильно в INSERT INTO ... SELECT ...
оператор. Тогда можно сделать простое RENAME
оператор для свопинга его. Тогда необходимо сделать другой INSERT INTO ... SELECT ... WHERE ...
и возможно UPDATE ... INNER JOIN ... WHERE ...
для захвата всех измененных данных. необходимо сделать INSERT
и UPDATE
быстро , или код будет, перейдя на добавляющие новые строки и обновления снимка, который будет вмешиваться в обновление. (У Вас не будет этой проблемы, если можно поместить приложение в maintenence режим в течение нескольких минут до RENAME
.)
Кроме этого, существуют некоторые ключевые и связанные с буфером настройки, которые можно изменить всего для одной сессии, которая может помочь основным данным переместиться. Вещи как [1 113] и read_buffer_size
были бы полезны для увеличения.
put использует $ stdout внутри. Из-за того, как это работает, самый простой способ проверить - просто использовать: $ stdout.should_not_receive (: write)
Что проверяет, что ничего не записывается в stdout, как ожидалось. Kernel.puts (как указано выше) приведет к провалу теста, только если он явно называется так (например, Kernel.puts «Некоторый текст»), где в большинстве случаев он вызывается в рамках текущего объекта.