2012-01-27 3 views
2

J'ai lu à propos de la méthode add_index dans Rails.Quels champs dois-je indexer dans une application Rails?

Dans un tutoriel, je trouve cet exemple:

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 

Je ne sais pas pourquoi [:user_id, :created_at] sont indexées et non les autres. Comment connaître les champs à indexer dans une application Rails?

Comment savoir quels champs indexer dans une application Rails?

Répondre

2

Eh bien, cela dépend de votre application, vous indexez principalement les clés étrangères pour améliorer les performances de la base de données. Par exemple, la prochaine fois que vous allez rechercher tout le micropost qui appartient à un utilisateur, il utilisera l'index user_id, et chaque fois que vous recherchez tous les messages créés entre certaines heures, j'utiliserai l'index created_at. Les index accélèrent les requêtes, vous indexez en fonction des requêtes que vous allez faire constamment.

+0

Désolé, les clés ** étrangères ** sont-elles en anglais? – alexchenco

+0

Les clés étrangères sont des clés référençant des tables en dehors de la table. –

+1

Ce sont des champs utilisés par la base de données pour maintenir les relations. L'id_utilisateur est une clé étrangère, car c'est le champ qui relie le microposte à l'utilisateur. Le champ lui-même est comme un pointeur si vous le souhaitez, il pointe vers une autre table. – daniel

1

Je dirais que partout il y a une relation belongs_to, y compris les tables de jointure, il devrait y avoir un index correspondant. Certains pourraient appeler cela par-dessus bord, mais la différence de performance entre une relation indexée et une relation non-indexée est profonde. Donc, si un User a beaucoup de Books, alors votre migration devrait avoir la ligne add_index: :books, :user_id correspondante. Si un Book has_many Authors, et un Author aussi has_many Books par une table de jointure BookAuthorings, il devrait y avoir deux indices sur BookAuthoring - qui couvre author_id, et qui couvre book_id.

Je dirais qu'un bon, solide 90% des problèmes de performance de Rails que j'ai rencontrés proviennent d'un index manquant quelque part.

0

J'indexe principalement (comme d'autres l'ont dit) les clés étrangères et tous les autres champs que j'ai l'intention d'utiliser pour la recherche ou le tri. Donc dans votre cas, j'ajouterais une clé au moins au champ de titre si vous voulez montrer les microposts dans l'ordre alphabétique.

Dans le cas du champ content, cela peut dépendre. S'il contient beaucoup de texte, il est peu probable que vous fassiez un tri simple ou une recherche, mais que vous souhaitiez effectuer une recherche en texte intégral. Dans ce cas, un index de base de données normal ne serait pas d'une grande aide et vous devriez utiliser un moteur de recherche fulltext à la place.

Questions connexes