Nous avons une table mysql qui à tout moment compte environ 12 millions de lignes. Nous devons supprimer les anciennes données pour garder la taille de la table quelque peu gérable.
À l'heure actuelle, nous exécutons cette requête quotidiennement, à minuit, à l'aide d'un travail cron:
DELETE FROM table WHERE endTime < '1393632001'
La dernière fois que la requête a été exécutée, elle a examiné 4 602 400, a pris plus de 3 minutes et le processeur a traversé le toit.
Que pouvons-nous faire pour empêcher le processeur, les connexions synchrones de la base de données, la profondeur des repères de disque, etc. de monter de façon déraisonnable tout en effaçant les anciennes données?
PS: Vous remarquerez que la requête se produit en fait à un moment assez inopportun de notre cycle d'utilisation. Supposons que nous ayons déjà décalé le timing de la requête pour qu'elle se produise au point d'utilisation le plus bas chaque jour. De plus, il n'y a pas d'index sur "endTime" et je préférerais le garder de cette façon si possible car il y a une tonne de données insérées très régulièrement, et pas beaucoup de recherche.
Réponses:
La solution à votre problème est une capacité MySQL appelée "partitionnement". La documentation est ici .
Le partitionnement stocke une seule table dans des "partitions" distinctes. Ceux-ci sont définis par une expression particulière, généralement une valeur ou une plage de colonne. Dans votre cas, cela serait probablement basé sur
endTime
- en supposant qu'il est connu lorsqu'un enregistrement est créé et qu'il ne change pas.Vous stockeriez la valeur d'une journée
endTime
dans chaque partition. Ensuite, l'étape de suppression serait de tronquer une partition plutôt que de supprimer un groupe de lignes dans une grande table. La troncature de partition serait une méthode beaucoup plus rapide.la source