2017-08-30 1 views
-3

J'ai une table qui contient 20 millions d'enregistrements. tous les jours Je supprime 100K enregistrements et 100K enregistrement sont insérés mais quand j'insère des enregistrements, il prend plus de temps.Sql insertion requête ralentir lors de l'insertion de 100k enregistrements

La table comporte un index clusterisé (clé primaire).

Je l'ai déjà essayé sp_updatestats après la suppression d'enregistrements

+3

Je vous recommande d'abord lire quelques conseils sur ** [comment poser des questions parfaite] (https://codeblog.jonskeet.uk/2010/08/29/writing-the-perfect-question /) ** et ** [comment créer créer un exemple minimal, complet et vérifiable] (https://stackoverflow.com/help/mcve) puis éditer votre question en conséquence pour attirer plus de personnes à votre poste. –

+0

Bienvenue dans Stack Overflow. @ MarcinOrlowski a une bonne suggestion. Lisez également http://meta.stackoverflow.com/a/271056/ et accordez une attention particulière à la section sur les performances des requêtes. Alors [edit] votre question. –

+0

"Plus de temps" ne signifie rien pour nous. Tout d'abord, «plus» doit être comparé à quelque chose, et même «c'était beaucoup de temps», ça pouvait encore être 10 minutes ou 10 heures. –

Répondre

0

Ainsi, vous conservez la valeur d'environ 200 jours de données? (Peut-être 6 mois?) Et vous supprimez le jour le plus ancien? Qu'est-ce que le PRIMARY KEY? Peut-être un AUTO_INCREMENT? Si non, alors nous devons l'étudier. Et vous avez une colonne datetime ou timestamp.

PARTITION BY RANGE(TO_DAYS(datetime)) en environ 28 semaines. Puis DROP PARTITION chaque semaine et REORGANIZE PARTITIONS future INTO next_week, future. Plus de détails here. Avec cela, la suppression sera 'instantanée', tout comme la création d'une nouvelle partition. Et les autres partitions ne seront pas gâchées, évitant ainsi tout ce qui est actuellement en train de provoquer "prendre plus de temps".

Si vous avez besoin d'en discuter davantage, veuillez indiquer SHOW CREATE TABLE et dites-nous comment vous avez procédé à la suppression.

0

Vous souffrez de ballonnement de la table. L'espace disque n'est jamais libéré par mysql lorsque vous supprimez des enregistrements et les insertions doivent donc rechercher toutes les données inutiles que vous avez supprimées, provoquant ainsi vos ralentissements. C'est l'une des principales raisons pour lesquelles je choisis d'utiliser postgres pour des projets non triviaux. Votre problème réel est vos choix d'installation de base de données.

Votre meilleur pari est le partitionnement de vos tables par date. J'ai trouvé que cela accélérait grandement les choses dans votre situation. https://dev.mysql.com/doc/refman/5.5/en/partitioning-range.html

EDIT: cela pourrait être utile de votre temps pour lire ainsi: https://www.jeffgeerling.com/blogs/jeff-geerling/reclaim-your-hard-drive-saving