Rails / MySQL ленивая запись на .save (обновления / записи) - PullRequest
1 голос
/ 30 октября 2010

Я работаю над довольно крупным проектом по миграции данных, который включает в себя перемещение данных между серверами и различными схемами активных записей.Вся миграция буквально занимает дни.

Как реализовать решение для кэширования, в котором мой код миграции Ruby при вызове метода сохранения Active Record записывает в кэш (который затем асинхронно обновляет базу данных MySQL).Память не является ограничением.

Кажется, что все решения для кэширования в Rails хорошо справляются с загрузкой / чтением запросов, но записи - это то, что я не смог найти много.

это то, что легко выполнимо в MySQL путем настройки параметров конфигурации?Или существует решение для кэширования Ruby / Rails, которое существует?

Я смотрел на отложенное задание, хотя это не слой кэширования (и не очевидно, что кто-то использовал его для отложенных операций записи в базу данных).Я посмотрел на таблицы памяти MEMORY в MySQL, но, конечно, они не записываются на диск.Memcached не предназначен для этого.

Пожалуйста, сообщите!

Ответы [ 2 ]

2 голосов
/ 30 октября 2010

Что вы имеете в виду, как я могу быстро вставить данные, не дожидаясь, пока MySQL обновит все свои индексы, чтобы моя миграция базы данных не заняла много времени?

Существует два решения для ускорения вставки базы данных, но они также имеют серьезные недостатки:

Я нашел INSERT DELAYED, чтобы помочь. Он запускает ваш запрос и сразу же возвращает. MySQL ставит в очередь несколько таких запросов на несколько секунд и применяет их, когда больше нечего делать. Это отлично подходит для регистрации и тому подобное.

Недостатком является то, что если ваш db падает, очередь INSERT операторов теряется.

Еще один вариант:

  • Создайте новую схему базы данных - без индексов!
  • Перенос ваших данных, ВСТАВЬТЕ прочь. Это быстрее, потому что MySQL не нужно будет обновлять ваши индексы при вставке.
  • Когда все данные будут перенесены, добавьте свои индексы.

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

Третий вариант, который я настоятельно рекомендую, - использовать чистый SQL вместо ActiveRecord. Если вам нужно перенести 1 миллион записей, ActiveRecord должен выделить 1 миллион раз экземпляр вашей модели ActiveRecord, выполнить запрос, а затем снова утилизировать объект.

Создание и удаление этих объектов не займет много времени, но если вы сделаете это миллион раз, это сложится.

Если вам не повезет, вы столкнетесь с утечкой памяти, и старый объект не будет освобожден из памяти. Это займет много памяти и может привести к сбою процесса ruby.

Отрежьте посредника и используйте сырой SQL, где это возможно. Использование ruby ​​для выполнения SQL не является проблемой, но сделайте его максимально простым.

0 голосов
/ 30 октября 2010

Если вы просто хотите перенести данные, почему бы вам не использовать хранимые процедуры непосредственно из базы данных? я уверен, что это более эффективно, чем использование слоя ActiveRecord

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...