проверьте на (отсутствие) 'помещает' в RSpec

Необходимо думать о требованиях немного более тщательно.

На самом простом уровне, "самый быстрый" способ изменить таблицу состоит в том, чтобы выполнить в нем как можно меньше ALTER TABLE операторы, предпочтительно один. Это вызвано тем, что MySQL копирует данные таблицы для изменения схемы и внесения пятнадцати изменений, пока делают единственную копию, очевидно (и действительно), быстрее, чем копирование таблицы пятнадцать раз, внося одно изменение за один раз.

, Но я подозреваю, что Вы спрашиваете, как сделать это изменение с наименьшим количеством суммы времени простоя. Путем я сделал бы это, Вы в основном синтезируете способ, которым работал бы неблок ALTER TABLE. Но это имеет некоторые дополнительные требования:

  1. Вам нужен способ отследить добавленные и измененные данные, такой как с "измененным" полем даты для последнего, или AUTO_INCREMENT поле для первого.
  2. Вы должны расположить с интервалами, чтобы иметь две копии Вашей таблицы на базе данных.
  3. Вам требуется период времени, где изменения к таблице не доберутся также далеко впереди снимка

, основная техника - как Вы предположили, т.е. использование 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 были бы полезны для увеличения.

10
задан John F. Miller 9 October 2009 в 21:43
поделиться

1 ответ

put использует $ stdout внутри. Из-за того, как это работает, самый простой способ проверить - просто использовать: $ stdout.should_not_receive (: write)

Что проверяет, что ничего не записывается в stdout, как ожидалось. Kernel.puts (как указано выше) приведет к провалу теста, только если он явно называется так (например, Kernel.puts «Некоторый текст»), где в большинстве случаев он вызывается в рамках текущего объекта.

15
ответ дан 3 December 2019 в 20:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: