Что вы имеете в виду, как я могу быстро вставить данные, не дожидаясь, пока MySQL обновит все свои индексы, чтобы моя миграция базы данных не заняла много времени?
Существует два решения для ускорения вставки базы данных, но они также имеют серьезные недостатки:
Я нашел INSERT DELAYED
, чтобы помочь. Он запускает ваш запрос и сразу же возвращает. MySQL ставит в очередь несколько таких запросов на несколько секунд и применяет их, когда больше нечего делать. Это отлично подходит для регистрации и тому подобное.
Недостатком является то, что если ваш db падает, очередь INSERT
операторов теряется.
Еще один вариант:
- Создайте новую схему базы данных - без индексов!
- Перенос ваших данных, ВСТАВЬТЕ прочь. Это быстрее, потому что MySQL не нужно будет обновлять ваши индексы при вставке.
- Когда все данные будут перенесены, добавьте свои индексы.
Недостатком здесь является то, что ваши данные могут быть непоследовательными. например у вашей исходной базы данных есть повторяющиеся значения, которые вы не хотите использовать в своей целевой базе данных.
Третий вариант, который я настоятельно рекомендую, - использовать чистый SQL вместо ActiveRecord. Если вам нужно перенести 1 миллион записей, ActiveRecord должен выделить 1 миллион раз экземпляр вашей модели ActiveRecord, выполнить запрос, а затем снова утилизировать объект.
Создание и удаление этих объектов не займет много времени, но если вы сделаете это миллион раз, это сложится.
Если вам не повезет, вы столкнетесь с утечкой памяти, и старый объект не будет освобожден из памяти. Это займет много памяти и может привести к сбою процесса ruby.
Отрежьте посредника и используйте сырой SQL, где это возможно. Использование ruby для выполнения SQL не является проблемой, но сделайте его максимально простым.