Eu tenho uma pergunta sobre o banco de dados Rails.
- Devo adicionar "index" a todas as chaves estrangeiras como "xxx_id"?
- Devo adicionar "index" à coluna "id" criada automaticamente?
Devo adicionar "índice (exclusivo)" à coluna "id" criada automaticamente?
Se eu adicionar índice a duas chaves estrangeiras ao mesmo tempo (
add_index (:users, [:category, :state_id])
, o que acontece? Como isso é diferente de adicionar o índice para cada chave?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
Ótima resposta até agora. Pergunta adicional.
- Eu deveria adicionar "index with unique" para xxx_id, certo?
A indexação pode ser uma coisa sutil e complicada, mas existem regras gerais que se aplicam que podem facilitar muito a determinação de qual usar.
A primeira coisa a lembrar é que os índices podem funcionar de mais de uma maneira. Um índice em A, B, C também funciona para A, B e simplesmente A, para que você possa projetar seus índices para serem mais versáteis se os solicitar corretamente. A lista telefônica é indexada em Sobrenome, Nome, para que você possa procurar facilmente as pessoas pelo sobrenome ou uma combinação de sobrenome e nome. Você não pode, no entanto, procurá-los diretamente pelo primeiro nome. Você precisaria de um índice separado para isso. O mesmo vale para o número de telefone, que você também precisará indexar.
Com isso em mente, há muitas coisas que ditarão como você cria índices:
belongs_to
-has_many
relação de pareamento, você precisa ter um índice na chave estrangeira usada.has_many :through
relacionamento, sua tabela de junção deverá ter um índice exclusivo nas duas propriedades envolvidas na junção como uma chave composta.has_many
relacionamento usando um escopo, verifique se há um índice que inclua ahas_many
chave estrangeira e a coluna do escopo nessa ordem.O objetivo dos índices é eliminar as temidas operações de "varredura de tabela" ou "classificação de arquivo" que ocorrem quando seus dados não são indexados corretamente.
Em termos simples, observe as consultas geradas pelo seu aplicativo e verifique se as colunas mencionadas
WHERE
ou asHAVING
condições eORDER BY
cláusulas estão representadas nessa ordem.fonte
index: true
sua definição de coluna para casos simples, mas às vezes você pode querer ter mais controle sobre ela. Ter índices por padrão em chaves estrangeiras não é um padrão terrível, mas pode surpreender as pessoas.add_index :users, :email, unique: true
)order by [a, b]
oufind where( a and b )
, precisará de um índice duplo:Exemplo concreto:
Se você tem:
Você deve adicionar:
Nota: Um índice ocupa espaço extra no disco e torna mais lento a criação e a atualização de cada registro, porque é necessário reconstruir cada índice.
Crédito:
https://tomafro.net/2009/08/using-indexes-in-rails-choosing-additional-indexes , trilhos - created_at quando o usuário solicita, você deve adicionar um índice à tabela? e as respostas acima.
fonte