L'instance MySQL d'Amazon RDS exécute très lentement
j'ai publié mon site Web sur Amazon EC2 (Région de Singapour) et j'ai utilisé MySQL RDS instance pour le stockage de données. Tout fonctionne très bien sauf la performance.
j'ai l'impression que tous mes requêtes, spécialement instruction select, est très lente. Si je vérifie cette question sur mon PC local, il fonctionne très bien. Mais quand j'essaie d'obtenir des données de l'instance RDS, c'est très lent. Certaines des déclarations select prennent 2-3 secondes pour aller chercher données.
j'ai accordé correctement tous les index de table, et normalisé/dé-normalisé selon les besoins. J'ai fait tous les réglages nécessaires sur RDS custom parameter group (par ex. max_connection,tampon etc). Je ne sais pas si je manque quelque chose, mais ça n'a pas marché pour moi - la performance n'a pas augmenté.
Donc, quelqu'un peut-il m'aider avec ce problème?
6 réponses
il est intéressant de noter que, pour quelque raison que ce soit, le cache de requête MySQL est désactivé par défaut dans RDS. Nous l'avons appris nous-mêmes à la dure cette semaine.
cela n'aidera pas la performance de votre requête initiale, mais cela peut accélérer les choses en général.
Pour ré-activer la mise en cache de requêtes:
- ouvrir une session dans le système RDS de la Console
- cliquez sur votre instance RDS pour voir les détails
- modifier le groupe de paramètres de la base de données
- assurez-vous de définir les deux
query_cache_size
etquery_cache_type
(Disclaimer: je ne suis pas administrateur de base de données, donc il y a peut être des choses qui me manque ici)
il est important d'avoir vos instances RDS et EC2 pas dans la même région mais dans la même zone de disponibilité pour minimiser la latence.
j'avais une API hébergée en Irlande sur EC2 et j'ai déplacé la base de données vers un cluster MySQL en Virginie USA que nous avions mis en place pour un autre projet et le voyage aller-retour sur chaque requête SQL a rendu l'API inutilisable.
tout d'abord je recommande fortement de regarder ces requêtes en utilisant
AFFICHER LA LISTE COMPLÈTE DES PROCESSUS
Vous pouvez en lire plus à ce sujet sur AFFICHER LA LISTE COMPLÈTE DES PROCESSUS
ceci vous montrera le temps que prend chaque requête.
alors vous pouvez utiliser
expliquer
Vous pouvez en lire plus à ce sujet sur expliquer
cela vous montrera si vous avez besoin d'amélioration sur votre les requêtes
RDS MySQL rendement peut être augmenté dans une des manières suivantes à condition que le système a de plus lire ratio:
P1) utilisez des types d'instance plus grands, ils viennent avec une meilleure bande passante NW. Exemple AWS Quadrapule EXL est livré avec une bande de 1000Mbps.
P2) utilisez PIOPS storage vous pouvez extraire 12500 IOPS de 16KB de MySQL DB
P3) si beaucoup de lecture est effectuée, ajouter une ou plusieurs répliques de lecture pour augmenter la performance de lecture
P4) appliquer des pratiques courantes telles que : Réglage des requêtes, appliquer les indices etc
Pour moi, cela n'a rien à voir avec MySQL, mais plutôt le type d'instance, j'ai été sur t2.medium
. Le problème est que j'ai manqué de crédits CPU parce que la charge sur le DB était trop élevée et le solde a continué à baisser jusqu'à ce que finalement, je recevais beaucoup moins de crédits horaire que là où nécessaire.
voici ce que j'ai vu dans RDS CloudWatch sous L'Utilisation du crédit CPU:
Si vous avez le même problème, il peut être temps de passer à un autre instance. Voici la liste des types d'instances:
https://aws.amazon.com/rds/instance-types/
Espérons que cette aide.
vous pouvez vérifier où la requête prend du temps en utilisant le profilage. Utilisez la requête suivante:
- définir le profilage=1
- exécuter votre requête select
- afficher le profil
cela vous indiquera l'état de la requête et l'endroit où elle passe son temps. Si la somme de tout le temps retourné par le profilage est inférieure au temps d'exécution réel de la requête, alors peut-être d'autres facteurs comme la bande passante du réseau peuvent être cause de celui-ci.