2010-12-14 31 views
12

Bonjour pour un de mes modèles de photos je:- created_at lorsque l'utilisateur pour la commande, Devriez-vous ajouter un index à la table?

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

Étant donné que je commande par created_at et Version ... Dois-je avoir un indice sur DB created_at?

Merci

+0

Cela semble être une bonne pratique à faire. Mais peut-être que cela ne fera pas de différence en termes de vitesse car, lorsqu'ils sont triés par identifiant, ils sont (généralement) déjà triés et Rails génère automatiquement un index pour l'identifiant. –

Répondre

6

Ce qui suit est basé sur mon expérience de PostgreSQL, mais probablement aussi pour appliquer MySQL et d'autres.

Si vous prévoyez de récupérer un grand nombre d'enregistrements à partir de cette table ou d'utiliser la pagination, un index sur les champs utilisés dans ORDER BY serait utile.

Vous devez créer un index sur tous les champs de commande dans le même ordre. Si vous mélangez ASC et DESC dans votre ORDER BY, vous devrez créer un index avec ces commandes spécifiques pour tirer pleinement parti de l'index.

Une migration ActiveRecord adaptée à votre table des photos serait:

add_index :photos, [:created_at, :version] 

Je vous conseille de regarder à la sortie EXPLAIN ANALYZE avec des données comme la production avant et après l'ajout de l'indice pour confirmer qu'il est d'avoir l'effet que vous êtes après.

9

Je lisais cette dernière nuit que j'ajoutais des index à un certain nombre de tables. La reponse courte est oui'. L'affaire est tout à fait avec éloquence ici:

http://tomafro.net/2009/08/using-indexes-in-rails-choosing-additional-indexes

La réponse plus est « oui », mais pourquoi ne pas tester un peu et de voir quel genre de kilométrage vous en sortir en fonction de la façon dont votre application interagit avec les données.

+0

Super article. Il ne parle pas seulement de SQL, mais aussi d'ActiveRecord. Cependant, vous ne pouvez pas forcer l'utilisation d'un index particulier dans PostgreSQL. Ce qui me rend curieux de savoir comment les choses se passent dans ActiveRecord 3 avec les instructions préparées, car l'accélération que vous obtenez avec pg est d'éviter l'analyse du plan à chaque fois. – m33lky

13

Une astuce qui peut être utile: dans les modèles typiques MySql/ActiveRecord, vous aurez id comme une clé primaire numérique (donc indexé implicitement), qui devrait être dans le même ordre de created_at - ce qui signifie que vous pouvez commander par id à la place et obtenir la performance rapide, sans le coût d'écriture pour un index supplémentaire.