Supprimer efficacement les anciens enregistrements MySQL, en ne conservant que les derniers N
La suppression de toutes les entrées, sauf les N plus récentes, dans une table MySQL nécessite une construction minutieuse des requêtes. Une approche simple utilisant LIMIT
dans une instruction DELETE
échoue souvent en raison des limitations de MySQL.
Une tentative erronée courante ressemble à ceci :
<code class="language-sql">DELETE FROM `table` ORDER BY `id` ASC LIMIT ((SELECT COUNT(*) FROM `table`) - N);</code>
Cela échoue car MySQL n'autorise pas les sous-requêtes directement dans la clause LIMIT
.
Une solution robuste utilise une sous-requête imbriquée :
<code class="language-sql">DELETE FROM `table` WHERE `id` NOT IN ( SELECT `id` FROM ( SELECT `id` FROM `table` ORDER BY `id` DESC LIMIT 42 -- Replace 42 with your desired N ) AS `subquery` );</code>
Cette méthode sélectionne d'abord les ID des N enregistrements les plus récents (classés par id
décroissant) à l'aide d'une sous-requête interne. La requête externe supprime ensuite tous les enregistrements dont les ID ne sont pas présents dans cette sélection interne. Cela ne conserve effectivement que les N dernières entrées.
N'oubliez pas de remplacer 42
par la valeur souhaitée de N
. Pour des performances optimales avec de grands ensembles de données, des techniques d'optimisation supplémentaires peuvent être nécessaires. Explorez des approches alternatives et envisagez d'indexer votre colonne id
pour des améliorations de vitesse significatives. Consultez des ressources supplémentaires pour des solutions avancées adaptées aux besoins de performances spécifiques.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!