Подтвердить что ты не робот

Rails 3 Индексы базы данных и другая оптимизация

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

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

Означает ли это, что мои индексы не были применены к моим уже существующим данным? Будут ли они добавлены только к новым записям?

Кроме того, я изучаю другие решения для масштабирования, такие как memcached, и все вокруг, уменьшая мои запросы и т.д.

Если кто-нибудь может указать мне на некоторые хорошие ресурсы для оптимизации моего приложения rails 3, я был бы очень признателен!

Спасибо!

EDIT:

Спасибо за все замечательные ответы на индексы базы данных! Что еще я должен искать с точки зрения оптимизации и масштабирования моего приложения? Memcached? Что имеет наилучшее соотношение производительности и усилий в плане оптимизации?

4b9b3361

Ответ 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.