Bonjour à tous,
Après avoir longuement cherché sur internet des indices pouvant me faire avancer, je me suis inscrit sur ce cite et posté mon premier sujet sur le forum pour y trouver de l'aide.
J'espère ne pas poser une question déjà présente dans ce forum mais je n'ai pas trouvé d'informations pertinentes.
Je rencontre actuellement un problème de comportement (et de performance) sur des tables MySQL sous le moteur InnoDB.
Contexte
Nous avons un table contenant entre 20 et 30 millions d'enregistrement, chaque enregistrement a un identifiant auto incrémenté (PK).
Nous voulons purger quotidiennement cette table (sauvegarde puis suppression).
Constat
Au départ, la table était sous le moteur MyISAM.
MyISAM ne gérant que des locks par table, la table était bloquée durant nos requêtes de DELETE (30s de temps d'exécution).
Nous sommes passés sous le moteur InnoDB qui gère les locks par enregistrement.
Après modification du moteur, deux constats important:
- La table est toujours lockée: impossible de faire un INSERT ou un DELETE pendant l'exécution du DELETE de purge.
- La requête de DELETE de purge est passée de 30s d'exécution a 7m30
Remarque: deux démarches ont été testées pour le passage MyISAM->InnoDB, par un simple ALTER TABLE et par une suppression/création/peuplement de table, et les résultats sont identiques.
Pour information, la requête de DELETE est : DELETE FROM maTable ORDER BY ID LIMIT 500000 ;
Questions
- InnoDB gère-t-il bien les locks par enregistrement, même durant un DELETE important ?
- Y a-t-il des options particulières, voire des optimisations, à positionner pour passer en mode lock par enregistrement ?
- Comment optimiser ma requête de DELETE pour qu'elle redescende vers les 30s d'exécution ?
Merci d'avance aux experts MySQL.
Partager