2 votes

Problème de performance MySQL sur une grande table - comment puis-je mettre en cache les résultats de manière efficace ?

Je dispose d'une table MySQL pour stocker les statistiques des utilisateurs avec >2MM lignes et 8 colonnes et un index sur l'ID utilisateur. Lorsque l'utilisateur visite son profil, beaucoup de ces informations sont récupérées de la base de données, entraînant - dans le pire des cas - une douzaine de requêtes SELECT parfois jointes à d'autres tables. C'est similaire au profil sur SO qui doit aussi extraire beaucoup de données.

Certaines requêtes, comme celles pour obtenir le score de l'utilisateur, nécessitent un COUNT et d'autres fonctions MySQL consommatrices de performances. Ainsi, rien que les requêtes pour la page de profil peuvent prendre jusqu'à 10-20 secondes.

Maintenant mes questions :

  1. Comment un site web comme SO parvient-il à extraire autant d'informations aussi rapidement ?
  2. Dois-je mettre en place une couche de mise en cache ?
  3. Devrais-je précalculer le nombre de points, etc. qui consomment les performances de MySQL ?
  4. Devrais-je utiliser une table optimisée pour l'écriture et une autre pour la lecture ? Si oui, comment pourrais-je récupérer des données en temps réel comme sur SO ?
  5. Devrais-je passer à un autre système que MySQL ?

2voto

srini.venigalla Points 3734

Comment un site web comme SO extrait-il autant d'informations aussi rapidement?

Ils vous donnent l'illusion d'extraire "tant" de données, mais en réalité, ils obtiennent un morceau à la fois. Fondamentalement, vous auriez besoin d'une requête pour obtenir le NOMBRE des résultats, et une autre requête pour obtenir les données pour n'importe quelle page dans ce jeu de résultats. Le jeu de résultats n'est pas mis en cache. Les paramètres de la requête peuvent être mis en cache. Mais il est préférable de les implémenter de sorte que les paramètres de la requête soient fournis à chaque requête de page.

Dois-je avoir une couche de mise en cache?

Peut-être. Mais ce n'est pas nécessaire à implémenter. La mise en cache peut être utile pour stocker les pages précédemment extraites, et les mêmes pages sont utilisées par toute la communauté, plutôt que par un seul utilisateur.

Dois-je précalculer le nombre de points, etc. qui peuvent consommer les performances de MySQL?

Non pertinent pour ce cas d'utilisation.

Devrais-je utiliser une table optimisée pour l'écriture et une table optimisée pour la lecture? Si oui, comment pourrais-je récupérer des données en direct comme sur SO?

Non requis.

Devrais-je passer à autre chose qu'à MySQL?

Non requis.

Pour plus de détails sur ce concept, consultez les grilles Ajax paginées

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X