Je sais que je suis la résurrection de tout à fait une vieille question, mais j'ai récemment rencontré ce problème, mais besoin de quelque chose que les échelles à un grand nombre de puits. Il n'y avait pas de performance des données, et depuis que cette question a eu un peu d'attention, je pensais que je poste ce que j'ai trouvé.
Les solutions que effectivement travaillées ont été les Alex Barrett double sous-requête/NOT IN
méthode (similaire au projet de Loi Karwin s), et Quassnoi de l' LEFT JOIN
méthode.
Malheureusement, les deux méthodes ci-dessus, de créer de très grandes intermédiaire de tables temporaires et les performances se dégradent rapidement que le nombre d'enregistrements de ne pas être supprimé est grande.
Ce que j'ai réglé sur utilise Alex Barrett double sous-requête (merci!) mais les utilisations <=
au lieu de NOT IN
:
DELETE FROM `test_sandbox`
WHERE id <= (
SELECT id
FROM (
SELECT id
FROM `test_sandbox`
ORDER BY id DESC
LIMIT 1 OFFSET 42 -- keep this many records
) foo
)
Il utilise OFFSET
, pour obtenir l'id de la Nième enregistrement et supprime cet enregistrement et tous les enregistrements précédents.
Depuis la commande est déjà une hypothèse de ce problème (ORDER BY id DESC
), <=
est un ajustement parfait.
Il est beaucoup plus rapide, puisque la table temporaire généré par la sous-requête contient un seul enregistrement à la place de N enregistrements.
Cas de Test
J'ai testé les trois méthodes de travail et la nouvelle méthode ci-dessus, dans les deux cas de test.
Les deux cas de test, l'utilisation de 10000 lignes existantes, tandis que le test de la première garde 9000 (efface le plus ancien de 1000) et le deuxième essai de conserve de 50 (efface le plus ancien 9950).
+-----------+------------------------+----------------------+
| | 10000 TOTAL, KEEP 9000 | 10000 TOTAL, KEEP 50 |
+-----------+------------------------+----------------------+
| NOT IN | 3.2542 seconds | 0.1629 seconds |
| NOT IN v2 | 4.5863 seconds | 0.1650 seconds |
| <=,OFFSET | 0.0204 seconds | 0.1076 seconds |
+-----------+------------------------+----------------------+
Ce qui est intéressant, c'est que l' <=
méthode considère une meilleure performance de l'ensemble du conseil d'administration, mais en fait, est de mieux en mieux le plus vous gardez, au lieu de pire.