2011-11-18 2 views
0

Je construis un projet de rails, et j'ai une base de données avec un ensemble de tables .. chacune contenant entre 500k et 1M lignes, et je crée constamment de nouvelles lignes.Optimiser la recherche dans la base de données Rails

De par la nature du projet, avant chaque création, je dois rechercher dans la table des doublons (pour un champ), donc je ne crée pas deux fois la même ligne. Malheureusement, à mesure que ma table grandit, cela prend de plus en plus de temps. Je pensais que je pourrais optimiser la recherche en ajoutant des index aux champs de chaîne spécifiques à travers lesquels je cherche .. mais j'ai entendu dire que l'ajout d'index augmente le temps de création.

Donc, ma question est la suivante: Quel est le compromis avec la recherche et la création de lignes qui contiennent des champs indexés? Je sais que l'ajout d'index aux champs fera que mon programme sera plus rapide avec le Model.find_by_name .. mais combien plus lent va-t-il rendre ma création de ligne?

Répondre

1

indexation ralentit insertation des entrées parce que son nécessaire pour ajouter l'entrée à l'index et qui a besoin de ressources, mais une fois ajouté qu'ils accélèrent vos requêtes de sélection, thats comme vous avez dit MAIS peut-être le b-arbre isnt le droit choix pour vous! Parce que le B-Tree indexe les premières X unités du sujet indexé. C'est génial quand vous avez des entiers, mais la recherche de texte est difficile. Lorsque vous faites des requêtes telles que

Model.where("name LIKE ?", "#{params[:name]}%") 

il permettra d'accélérer la sélection, mais lorsque vous utilisez des requêtes comme ceci:

Model.where("name LIKE ?", "%#{params[:name]}%") 

il vous aidera pas parce que vous devez rechercher la chaîne entière qui peut être plus que certains cent chars et ce n'est pas une amélioration d'avoir les 8 premières unités d'une chaîne de 250 char long indexée! Donc c'est une chose. Mais theres another ....

Vous devez ajouter un INDEX UNIQUE parce que la base de données est mieux dans la recherche de doublons puis ruby ​​est! C'est optimisé pour le tri et c'est définitivement le moyen le plus court et le plus propre de faire face à ce problème! De la raison vous devriez également ajouter une validation au modèle approprié mais ce n'est pas une raison de laisser les choses se cacher avec la base de données.

// sur la vitesse d'index

http://dev.mysql.com/doc/refman/5.0/en/insert-speed.html

Vous n'avez pas un grand nombre d'options. Je ne pense pas que la perte de vitesse d'insertion sera si grande quand vous avez seulement besoin d'un index! Mais la vitesse de sélection augmentera propotionall!

+0

Merci pour l'aide, mais si j'ajoute un index unique, dans quelle mesure cela ralentira-t-il les insertions? Je suis inquiet que cela ralentisse mon programme assez qu'il aurait mieux valu juste chercher sans index uniques. – BananaNeil

+0

Voir les nouveaux messages! – davidb

+0

Qui a voté contre mon poste (déjà accepté) et n'en a rien dit? – davidb

Questions connexes