J'ai une question sur la base de données Rails.
- Dois-je ajouter "index" à toutes les clés étrangères comme "xxx_id"?
- Dois-je ajouter "index" à la colonne "id" créée automatiquement?
Dois-je ajouter "index (unique)" à la colonne "id" créée automatiquement?
Si j'ajoute un index à deux clés étrangères à la fois (
add_index (:users, [:category, :state_id])
, que se passe-t-il? En quoi est-ce différent de l'ajout de l'index pour chaque clé?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
Excellente réponse jusqu'à présent. Question supplémentaire.
- Je devrais ajouter "index avec unique" pour xxx_id, non?
L'indexation peut être une chose délicate et subtile, mais il existe des règles générales qui s'appliquent qui peuvent faciliter la détermination des éléments à utiliser.
La première chose à retenir est que les index peuvent fonctionner de plusieurs manières. Un index sur A, B, C fonctionne également pour A, B et simplement A, vous pouvez donc concevoir vos index pour qu'ils soient plus polyvalents si vous les commandez correctement. L'annuaire téléphonique est indexé sur le nom, le prénom, de sorte que vous pouvez rechercher facilement les personnes par leur nom de famille ou une combinaison de nom et prénom. Cependant, vous ne pouvez pas les rechercher directement par leur prénom. Vous auriez besoin d'un index séparé pour cela. Il en va de même pour le numéro de téléphone, que vous devrez également indexer.
Dans cet esprit, il y a beaucoup de choses qui dicteront comment vous créez des index:
belongs_to
-has_many
, vous devez avoir un index sur la clé étrangère utilisée.has_many :through
relation, votre table de jointure doit avoir un index unique sur les deux propriétés impliquées dans la jointure en tant que clé composée.has_many
relation à l'aide d'une étendue, assurez-vous qu'il existe un index qui inclut lahas_many
clé étrangère et la colonne d'étendue dans cet ordre.Le but des index est d'éliminer les redoutables opérations de «balayage de table» ou de «tri de fichiers» qui se produisent lorsque vos données ne sont pas indexées correctement.
En termes simples, examinez les requêtes générées par votre application et assurez-vous que les colonnes référencées dans
WHERE
ou lesHAVING
conditions etORDER BY
clauses sont représentées dans cet ordre.la source
index: true
à votre définition de colonne pour les cas simples, mais parfois vous voudrez peut-être plus de contrôle sur elle. Avoir des index par défaut sur des clés étrangères n'est pas un terrible défaut à avoir, mais cela pourrait surprendre les gens.add_index :users, :email, unique: true
)order by [a, b]
oufind where( a and b )
, alors vous avez besoin d'un double index:Exemple concret:
Si tu as:
Vous devez ajouter:
Remarque: un index occupe de l'espace supplémentaire sur le disque et ralentit la création et la mise à jour de chaque enregistrement, car il doit reconstruire chaque index.
Crédit:
https://tomafro.net/2009/08/using-indexes-in-rails-choosing-additional-indexes , rails - created_at lorsque l'utilisateur pour la commande, devez-vous ajouter un index à la table? , et les réponses ci-dessus.
la source