Индексы базы данных Rails 3 и другая оптимизация - PullRequest
20 голосов
/ 22 мая 2011

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

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

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

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

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

Спасибо!

РЕДАКТИРОВАТЬ:

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

Ответы [ 2 ]

22 голосов
/ 22 мая 2011

Это всегда хорошая идея, чтобы добавить индексы ко всем вашим идентификаторам и данным, которые вы «находите» более чем в нескольких случаях, например, email_address.Точно так же можно смело предполагать, что идентификатор никогда не станет отрицательным, поэтому создание столбцов идентификаторов без подписи принесет пользу в долгосрочной перспективе.Поговорите с любым администратором базы данных (администратором базы данных), и он, скорее всего, скажет вам сделать это.

В настоящее время, скорее всего, у вас есть что-то подобное для всех ваших столбцов идентификаторов ...

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

API Rails должен дать вам все, что вам нужно знать.

В Peepcode действительно есть обучающее видео , которое былоотличное понимание для меня и стоит $ 12 и 37 минут вашего времени.Есть такие драгоценные камни, как MetaWhere , которые также могут вам помочь.

Наиболее важным в Rails 3 и выше является ActiveRelations.Здесь запросы выполняются только при необходимости.Например, вместо User.all вы можете вызвать User.scoped, и когда итерация в представлении происходит, SQL выполняется.Мощные вещи и будущее рельсов.

Дайте нам знать, как вы продвигаетесь ... Всего наилучшего.

8 голосов
/ 22 мая 2011

Вы писали:

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

Индексация не займет много времени, если у вас нет миллионов записей. Индексирование БД - это просто сортировка, и запись такого рода будет использоваться позже.

Ваш индекс применяется как к новым, так и к существующим записям.

UPDATE

Самый большой удар за доллар:

  1. Переместить долго выполняющиеся процессы в delayed_job (или аналогичный)
  2. Избавиться от n + 1 запросов

Memcache хорош, но усложняет ваше приложение, и вы, как правило, не получаете ускорения, пока ваше приложение не будет привязано к базе данных.

...