D'attente pour la table de niveau de verrouillage sur une table MySQL
Depuis quelques jours, à des heures aléatoires mon site est devenu très lent. J'ai commencé à étudier la meilleure que j'ai pu. J'ai vu que le MySQL processus a été à l'aide de 85 à 95% de la mémoire disponible de mon serveur (dois-je mettre à jour mon mémoire aussi?).
J'ai vérifié mon MySQL processus de journal, et j'ai remarqué une énorme liste de requêtes avec:
D'attente pour la table de verrou au niveau de la
Mais je l'avais aussi remarqué, ce que l'ENSEMBLE de ces questions avec "niveau de la table de verrouillage", a seules les requêtes qui avait quelque chose à faire avec ma table appelée users
.
J'ai 20 autres tables, avec la constante de requêtes, mais je ne les vois pas sur la liste.. Donc je suppose que le problème est avec la table des utilisateurs?
Je veux savoir comment je peux améliorer la table, et, éventuellement, de supprimer de la table verrou de niveau?
J'ai aussi couru ce:
SHOW VARIABLES LIKE 'query_cache%';
Qui a abouti à ceci:
query_cache_limit
1048576
query_cache_min_res_unit
4096
query_cache_size
33554432
query_cache_type
ON
query_cache_wlock_invalidate
OFF
S'il vous plaît laissez-moi savoir ce que je peux faire pour améliorer ma base de données/mysql.
Ceci est une liste des processus:
| 228 | db_user | localhost | db_db| Query | 5 | Waiting for table level lock | SELECT count(*) FROM users WHERE createtime>'1396411200' OR createtime='1396411200' |
| 229 | db_user | localhost | db_db| Query | 4 | Waiting for table level lock | UPDATE users SET upline_clicks=upline_clicks+'1', upline_earnings=upline_earnings+'0.0000' WHERE use |
| 203 | db_user | localhost | db_db| Query | 6 | Waiting for table level lock | SELECT SUM(cashedout) FROM users |
| 204 | db_user | localhost | db_db| Query | 4 | Waiting for table level lock | UPDATE users SET upline_clicks=upline_clicks+'1', upline_earnings=upline_earnings+'0.0000' WHERE use |
| 205 | db_user | localhost | db_db| Query | 1 | Waiting for table level lock | SELECT * FROM users WHERE id='12055' |
| 206 | db_user | localhost | db_db| Query | 2 | Waiting for table level lock | SELECT * FROM users WHERE id='22530'
| 197 | db_user | localhost | db_db| Query | 3 | Waiting for table level lock | SELECT * FROM `users` WHERE `username` = 'ptc4life123' LIMIT 1 |
| 200 | db_user | localhost | db_db| Query | 3 | Waiting for table level lock | UPDATE users SET upline_clicks=upline_clicks+'1', upline_earnings=upline_earnings+'0.0050' WHERE use |
C'est essentiellement ce que tous les verrouillé processus ressemble.
- Commencer à ajouter des index pour les utilisateurs, en particulier des domaines comme l'utilisateur nom de famille, dept, ID...tout ce qui pourrait souvent être utilisé dans les requêtes.
- Index? Soin d'élaborer un peu? (Désolé, je suis encore assez nouveau pour MySQL)
Vous devez vous connecter pour publier un commentaire.
Au cours d'une des périodes de ralentissement, exécutez cette commande:
Cela va vous montrer le réel des commandes SQL qui sont en cours d'exécution, et les endroits pour trouver en termes d'ajouter des index. Le Post le plus long de l'exécution de SQL si possible.
L'ajout d'un index ressemblera à ceci:
Mais vous voulez faire attention de ne pas le faire pendant une période de production. Au premier coup d'œil, vous voulez le faire sur l'ID et le nom d'utilisateur de colonnes dans la table user.
Vérifier le moteur de stockage de la table .Changement de Innodb si possible, car il ne provoquer que le verrouillage de niveau ligne.
Les requêtes qui sont en cours d'exécution peut être forcer un verrou de table, même si vous utilisez les tables innodb
si vous n'êtes pas à l'aide de l'index .