Voir Comment MySQL Utilise Les Index.
Aussi valider si MySQL effectue toujours un full table scan après vous ajoutez un supplément de 2000-ou-si les lignes de votre user_metrics
table. À de petites tables, accès par index est en fait plus chères (I/O-sage) de l'analyse d'une table, et MySQL optimiseur peut prendre cela en compte.
Contrairement à mon précédent post, il s'avère que MySQL est également à l'aide d'un optimiseur basé sur les coûts, ce qui est une très bonne nouvelle, à condition que vous exécutez votre ANALYZE
au moins une fois quand vous croyez que le volume de données dans votre base de données est représentative de l'avenir de la journée-à-jour d'utilisation.
Lorsque vous traitez avec des coûts basée sur les optimiseurs (Oracle, Postgres, etc.), vous devez assurez-vous d'exécuter périodiquement ANALYZE
sur vos différents tableaux que leur taille augmente de plus de 10 à 15%. (Postgres le fera automatiquement pour vous, par défaut, tandis que d'autres Sgbdr va laisser cette responsabilité à un DBA, c'est à dire vous). Grâce à l'analyse statistique, ANALYZE
aidera l'optimiseur de se faire une meilleure idée de la façon dont beaucoup d'I/O (et d'autres ressources associées, telles que le PROCESSEUR, nécessaire par exemple pour le tri) seront impliqués lors du choix entre les différents candidats des plans d'exécution. Incapacité à exécuter ANALYZE
peut entraîner dans de très mauvaises, parfois désastreuses décisions de planification (p. ex. ordre de la milliseconde requêtes de prendre, parfois, heures à cause de la mauvaise boucles imbriquées sur JOIN
s).
Si la performance n'est toujours pas satisfaisante après l'exécution de l' ANALYZE
, puis vous sera généralement en mesure de contourner le problème par l'utilisation d'indicateurs, par exemple, FORCE INDEX
, alors que dans d'autres cas, vous pourriez avoir trébuché sur un bug MySQL (par exemple, cette ancienne, ce qui pourrait avoir mordu vous étiez-vous d'utiliser les Rails' nested_set
).
Maintenant, puisque vous êtes dans une application Rails, il sera difficile (et à l'encontre du but de l' ActiveRecord
) pour émettre vos requêtes personnalisées avec des notes au lieu de continuer à utiliser l' ActiveRecord
-générés.
Je l'avais mentionné que dans notre application Rails tous SELECT
des requêtes a chuté en dessous de 100ms après le passage à Postgres, alors que certains des jointures complexes générés par ActiveRecord
, à l'occasion, prendre comme beaucoup de comme 15 ans ou plus avec MySQL 5.1 à cause de boucles imbriquées à l'intérieur des analyses de la table, même lorsque les indices étaient disponibles. Aucune optimiseur est parfait et vous devez être conscient des options. D'autres éventuels problèmes de performances d'être conscient de, outre l'optimisation de plan de requête, sont de verrouillage. C'est en dehors de la portée de votre problème.