Quand append quels index dans une table dans Rails

J’ai une question sur la firebase database Rails.


Bonne réponse jusqu’à présent. Question supplémentaire

  • Je devrais append “index with unique” pour xxx_id, non?

Dois-je append “index” à toutes les clés étrangères comme “xxx_id”?

Ce serait mieux, car cela accélère la recherche en sorting dans cette colonne. Et les clés étrangères sont quelque chose que l’on recherche beaucoup.

Depuis la version 5 des rails, l’index sera créé automatiquement, pour plus d’informations, voir ici .

Dois-je append “index” à la colonne “id” créée automatiquement?

Non, cela se fait déjà par rails

Dois-je append “index (unique)” à la colonne “id” créée automatiquement?

Non, comme ci-dessus

Si j’ajoute l’index à deux clés étrangères en même temps ( add_index (:users, [:category_id, :state_id]) , que se passe-t-il? Comment est-ce différent d’append l’index pour chaque clé?

L’index est alors un index combiné des deux colonnes. Cela n’a aucun sens, à moins que vous ne souhaitiez toutes les entrées pour un category_id ET un state_id (il devrait s’agir de category_id pas category ) en même temps.

Un index comme celui-ci accélérerait la requête suivante:

 # rails 2 User.find(:all, :conditions => { :state_id => some_id, :category_id => some_other_id }) # rails 3 User.where(:state_id => some_id, :category_id => some_other_id) 

 add_index :users, :category_id add_index :users, :state_id 

va accélérer ces demandes:

 # rails 2+3 User.find_by_category_id(some_id) User.find_by_state_id(some_other_id) # or # rails 2 User.find(:all, :conditions => {:category_id => some_id}) User.find(:all, :conditions => {:state_id => some_other_id}) # rails 3 User.where(:category_id => some_id) User.where(:state_id => some_other_id) 

Je devrais append “index with unique” pour xxx_id, non?

Non, car si vous faites cela, un seul utilisateur peut être dans une catégorie, mais la signification de la catégorie est que vous pouvez placer plus d’ utilisateurs dans une seule catégorie. Dans votre modèle d’ User , vous avez quelque chose comme cette belongs_to :category et dans votre modèle de catégorie quelque chose comme has_many :users . Si vous avez une relation has_many , le champ foreign_key ne doit pas être unique!

Pour plus d’informations à ce sujet, jetez un coup d’œil à la bonne réponse de tadman .

L’indexation peut être délicate et subtile, mais il existe des règles générales qui permettent de déterminer lesquelles utiliser plus facilement.

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. Le répertoire est indexé sur Nom de famille, Prénom, afin que vous puissiez rechercher facilement des personnes par leur nom de famille ou une combinaison de nom et prénom. Vous ne pouvez cependant 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 devez indexer également.

Dans cet esprit, il y a beaucoup de choses qui détermineront la façon dont vous créez vos index:

  • Si vous avez une belongs_to relations has_many , vous devez avoir un index sur la clé étrangère utilisée.
  • Si vous commandez vos enregistrements et qu’un grand nombre d’entre eux seront paginés, vous devez append cette colonne à la fin de l’index.
  • Si vous avez une relation has_many :through , 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.
  • Si vous récupérez un enregistrement directement en utilisant un identifiant unique tel qu’un nom d’utilisateur ou un e-mail, cela devrait être un index unique.
  • Si vous récupérez des ensembles d’enregistrements à partir d’une relation has_many aide d’une étendue, assurez-vous qu’il existe un index qui inclut la has_many étrangère has_many et la colonne d’étendue dans cet ordre.

Le but des index est d’éliminer les opérations redoutables de «scan de table» ou de «sorting 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 les conditions WHERE ou HAVING et les clauses ORDER BY sont représentées dans cet ordre.

  • Toujours indexer les clés étrangères
  • Toujours indexer les colonnes que vous allez commander par
  • Tous les champs uniques (pour garantir l’unicité au niveau de la firebase database. Exemple de migration: add_index :users, :email, unique: true )
  • Si vous commandez par deux choses, ou recherchez deux choses, par exemple: order by [a, b] ou find where( a and b ) , alors vous avez besoin d’un double index:

Exemple concret:

Si tu as:

 default_scope :order => 'photos.created_at DESC, photos.version DESC' 

Vous devriez append:

 add_index :photos, [:created_at, :version] 

Remarque: Un index occupe plus d’espace 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 commande, Faut-il append un index à la table? et les réponses ci-dessus.