Какие поля я должен индексировать в приложении Rails? - PullRequest
2 голосов
/ 27 января 2012

Я читал о методе add_index в Rails.

В руководстве я нашел этот пример:

class AddTitleToMicroposts < ActiveRecord::Migration
  def change
    create_table :microposts do |t|
      t.string :title
      t.string :content
      t.integer :user_id

      t.timestamps
    end
    add_index :microposts, [:user_id, :created_at]
  end
end 

Понятия не имею, почему индексируются [:user_id, :created_at], а не остальные.

Как узнать, какие поля нужно индексировать в приложении Rails?

Ответы [ 3 ]

2 голосов
/ 27 января 2012

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

1 голос
/ 27 января 2012

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

Итак, если User has_many Books, то ваша миграция должна иметь соответствующую строку add_index: :books, :user_id.Если Book has_many Authors и Author также has_many Books через таблицу соединения BookAuthorings, то в BookAuthoring должно быть два индекса - один, охватывающий author_id, и другой, охватывающийbook_id.

Я бы сказал, что хорошие, надежные 90% проблем с производительностью Rails, с которыми я столкнулся, связаны с отсутствующим индексом где-то.

0 голосов
/ 27 января 2012

Я в основном индексирую (как говорили другие) внешние ключи и все другие поля, которые я намерен использовать для поиска или сортировки. Так что в вашем случае я бы добавил ключ как минимум в поле заголовка, если вы хотите показывать микросообщения в алфавитном порядке.

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

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