Rails 3 Индексы базы данных и другая оптимизация
Я уже давно создаю приложения для rails, но, к сожалению, для меня ни у одного из моих приложений не было большого количества данных или трафика. Но теперь у меня есть тот, кто набирает обороты. Поэтому я сначала погружаюсь в масштабирование и оптимизацию своего приложения.
Кажется, что первый и самый простой шаг - это индексы базы данных. У меня есть хороший огромный список индексов, который должен охватывать почти все мои запросы, но когда я добавил их в свою базу данных через миграцию, потребовалось всего несколько секунд, чтобы добавить их. По какой-то причине я думал, что им придется проходить через все мои записи (из которых тысячи) и индексировать их.
Означает ли это, что мои индексы не были применены к моим уже существующим данным? Будут ли они добавлены только к новым записям?
Кроме того, я изучаю другие решения для масштабирования, такие как memcached, и все вокруг, уменьшая мои запросы и т.д.
Если кто-нибудь может указать мне на некоторые хорошие ресурсы для оптимизации моего приложения rails 3, я был бы очень признателен!
Спасибо!
EDIT:
Спасибо за все замечательные ответы на индексы базы данных! Что еще я должен искать с точки зрения оптимизации и масштабирования моего приложения? Memcached? Что имеет наилучшее соотношение производительности и усилий в плане оптимизации?
Ответы
Ответ 1
Всегда полезно добавить индекс к вашему идентификатору и данным, которые вы находите, более чем несколько раз, например. адрес электронной почты. Аналогично, вы можете с уверенностью предположить, что идентификатор никогда не станет отрицательным, поэтому создание столбцов идентификаторов Unsigned будет полезно в долгосрочной перспективе. Поговорите с любым администратором базы данных (DBA), и они будут больше раз, чем вам не скажут.
В настоящее время у вас, скорее всего, есть что-то подобное для всех ваших столбцов ID...
t.integer :column_name, :null => false
или...
t.references :column_name, :null => false
Просто изменив это на...
t.column :column_name, 'integer unsigned', :null => false
Вы увидите небольшое увеличение.
Индекс прост...
add_index :reviews, [:column_id, :column_type] # Polymorphic
add_index :reviews, :column_id # Standard
Rails API должен предоставить вам все, что вам нужно знать.
Peepcode действительно получает обучающее видео, которое было отличным пониманием для меня и хорошо стоило 12 и 37 минут вашего времени. Есть такие драгоценные камни, как MetaWhere, которые могут помочь вам.
Самое главное, что в Rails 3 и выше это ActiveRelations. Здесь запросы выполняются только при необходимости. Например, вместо User.all вы можете вызвать User.scoped и когда итерация в представлении происходит SQL в исполнении. Мощный материал и будущее рельсов.
Сообщите нам, как вы поживаете... Все самое лучшее.
Ответ 2
Вы писали:
но когда я добавил их в мою базу данных через миграцию, для их добавления потребовалось всего несколько секунд. По какой-то причине я думал, что им придется проходить через все мои записи (из которых тысячи) и индексировать их.
Индексация не займет много времени, если у вас нет миллионов записей. Индексирование DB - это просто сортировка и запись этого сортировки, который будет использоваться позже.
Ваш индекс применяется как к новым, так и к существующим записям.
ОБНОВЛЕНИЕ
Самый большой удар для вашего доллара:
- Переместить длинные процессы в delayed_job (или аналогичные)
- Избавиться от n + 1 запросов
Memcache приятный, но усложняет ваше приложение, и вы, как правило, не получаете повышение, пока ваше приложение не будет читать db.