У меня вопрос по базе данных Rails.
- Должен ли я добавить «индекс» ко всем внешним ключам, например «xxx_id»?
- Должен ли я добавить «индекс» в автоматически созданный столбец «id»?
Должен ли я добавить «индекс (уникальный)» в автоматически созданный столбец «id»?
Если я добавлю индекс сразу к двум внешним ключам (
add_index (:users, [:category, :state_id])
что произойдет? Чем это отличается от добавления индекса для каждого ключа?class CreateUsers < ActiveRecord::Migration def self.up create_table :users do |t| t.string :name t.integer :category_id t.integer :state_id t.string :email t.boolean :activated t.timestamps end # Do I need this? Is it meaningless to add the index to the primary key? # If so, do I need :unique => true ? add_index :users, :id # I don't think I need ":unique => true here", right? add_index :users, :category_id # Should I need this? add_index :users, :state_id # Should I need this? # Are the above the same as the following? add_index (:users, [:category, :state_id]) end end
Пока что отличный ответ. Дополнительный вопрос
- Я должен добавить «индекс с уникальным» для xxx_id, верно?
Индексирование может быть сложной и тонкой задачей, но существуют общие правила, которые могут значительно упростить определение того, что использовать.
Первое, что следует помнить, это то, что индексы могут работать более чем одним способом. Индекс для A, B, C также работает для A, B и просто для A, поэтому вы можете разработать свои индексы, чтобы они были более универсальными, если вы упорядочите их правильно. Телефонная книга проиндексирована по фамилии, имени, поэтому вы можете легко искать людей по фамилии или комбинации фамилии и имени. Однако вы не можете искать их напрямую по имени. Для этого вам понадобится отдельный индекс. То же самое и с номером телефона, который вам также придется проиндексировать.
Имея это в виду, есть много вещей, которые будут определять способ создания индексов:
belongs_to
-has_many
, вам нужен индекс для используемого внешнего ключа.has_many :through
связь, ваша таблица соединения должна иметь уникальный индекс для обоих свойств, участвующих в объединении, в качестве составного ключа.has_many
отношения с использованием области, убедитесь, что существует индекс, который включаетhas_many
внешний ключ и столбец области в этом порядке.Целью индексов является устранение ужасных операций «сканирования таблиц» или «сортировки файлов», которые происходят, когда ваши данные не индексируются должным образом.
Проще говоря, смотреть на запросах, вырабатываемый вашего приложение и убедиться , что столбцы , указанные в
WHERE
илиHAVING
условиях иORDER BY
положениях представлены в таком порядке.источник
index: true
в определение столбца для простых случаев, но иногда вам может понадобиться больше контроля над ним. Наличие по умолчанию индексов для внешних ключей - это не ужасно, но это может застать людей врасплох.add_index :users, :email, unique: true
)order by [a, b]
илиfind where( a and b )
, то вам нужен двойной индекс:Конкретный пример:
Если у вас есть:
Вы должны добавить:
Примечание. Индекс занимает дополнительное место на диске и замедляет создание и обновление каждой записи, так как он должен перестраивать каждый индекс.
Кредит:
https://tomafro.net/2009/08/using-indexes-in-rails-choosing-additional-indexes , rails - created_at, когда пользователь для заказа, следует ли добавлять индекс в таблицу? , и ответы выше.
источник