2010-10-01 3 views
0

J'ai une table (MyISAM) avec des colonnes views_total, views_24h, views_7d, views_30d. views_24h = voir pour les dernières 24 heures, views_7d = 7 derniers jours etc Toutes ces colonnes sont INT et INDEX parce que je fais le tri par eux.Mise à jour de views_24hours, views_7days, views_30days trop lent

Chaque heure (pour 24h), ou tous les jours (pour 7d, 30j) je mets à jour ces colonnes en utilisant UPDATE ... JOIN (... UNION ALL ...) USING ... SET ... UPDATE lui-même prend environ 2,5 sec. (100-120K lignes), mais avant de mettre à jour ces colonnes, je devrais les mettre à null. Donc, je fais UPDATE table SET views_24h = 0 et cette requête prend environ 4 secondes.

Existe-t-il un moyen d'accélérer cette mise à jour? Peut-être, je devrais choisir un autre algorithme ou un autre modèle de données à cette fin? Peut-être, je devrais séparer ces champs dans une autre table et juste faire DELETE (mais je vais provoquer la charge pendant JOIN lors de l'affichage)?

J'ai assez bonne solution NoSQL pour cette (Zset de Redis de type de données), mais je veux réaliser d'abord comment le faire rapidement MySQL ...

Merci.

Répondre

2

Vous dites que vous avez des index, mais j'imagine que ces index ne sont pas utilisés pour la mise à jour, uniquement pour le tri des requêtes SELECT. Ces index diminuent donc les performances de la mise à jour.

Habituellement, mon conseil est que la surcharge des index pendant UPDATE est plus que justifiée par leur avantage pendant SELECT. C'est probablement vrai dans votre cas aussi, mais vous avez demandé comment accélérer la mise à jour afin que nous nous concentrions sur cela.

Vous devez analyser la requête avec EXPLAIN mais MySQL ne prend pas en charge EXPLAIN UPDATE. Ainsi, vous aurez à faire un équivalent SELECT pour analyser l'optimisation:

EXPLAIN SELECT * FROM ... JOIN (...UNION ALL...) USING... 

Cela devrait vous montrer que ce soit à l'aide d'autres indices pour aider cette jointure. Je ne peux pas donner de suggestions plus spécifiques car vous n'avez pas montré la requête UPDATE complète, ou la structure complète de l'une de vos tables, ou quels autres index ils pourraient avoir.

Une autre astuce pourrait être de déposer vos index sur les colonnes de nombre de vues avant la mise à jour, afin de réduire le temps système. Ensuite, reconstruisez les index après la mise à jour. Cela pourrait rendre la mise à jour plus rapide, mais abandonner et recréer les index serait également coûteux.

Questions connexes