2010-11-05 7 views
0

J'ai un scénario où j'ai besoin de faire des quantités relativement importantes d'insertions. Disons que j'ai un million de lignes par minute ... qui est inséré dans des tables structurellement identiques, mais avec différents niveaux d'agrégation appliqués aux données.Mysql InnoDB fusionner/copier des données

Aussi, afin d'accéder à ces données à nouveau, il est très fortement indexé. Maintenant, afin de faire les insertions le plus rapidement possible, pour libérer du temps pour d'autres traitements, j'ai pensé à insérer dans une table "DUMP" qui a exactement la même structure, mais pas d'index ... et puis exécuter un "proc de fusion" qui triplerait ETL les données dans les tables agrégées indexées ... arguant que puisque tout se passe à l'intérieur de la base de données, il devrait être plus rapide que de le pousser plusieurs fois de l'extérieur.

Cependant, un simple "insérer dans tableB select * from tableA" dépasse facilement mon innodb_buffer_pool avec des verrous de ligne, puis erreur 1026es moi. Donc, enfin à la question: existe-t-il un moyen rapide/fiable de déplacer/fusionner des volumes de données volumineux d'une table à l'autre?
Les tables peuvent et seront probablement partitionnées. Je suppose que c'est un vœu pieux que vous puissiez simplement déplacer une partition d'une table à l'autre.
Si "sélectionnez de l'insertion dans" est-il, alors je suppose qu'il sera plus sûr et plus facile de simplement insérer tout cela du côté de l'application.

Répondre

1

Vous pouvez certainement insérer dans une table intermédiaire, puis transférer les lignes. Cela pourrait bien finir par faire plus de travail pour la DB. INSERER ... SELECT est certainement votre ami si vous voulez copier des données d'une table dans une autre, il sera certainement plus rapide que de le déplacer via le client.

1M lignes par minute est un tas d'inserts, vous aurez certainement besoin de construire votre application avec soin. Je suppose que vous faites déjà en gros lots (10 000 lignes semble généralement à peu près juste), mais vous voulez également être conscient du niveau de durabilité de innodb (c'est-à-dire quand il se vide). La désactivation du binlog de MySQL réduit sensiblement le nombre de fsyncs (c'est-à-dire 50% dans certains cas), ce qui est recommandé pour les charges de travail très élevées. Vous pouvez également regarder les différents travaux de réglage effectués par des tiers. Et bien sûr, utilisez le plugin pas l'innodb original.


Pour "libérer du temps pour d'autres traitements", vous voulez dire sur votre client ou votre base de données? Si c'est votre client, vous devez certainement insérer de manière asynchrone avec d'autres travaux - garder les disques en mémoire ou sur disque (mais attention à la durabilité de ce magasin) jusqu'à ce que vous ayez le temps de les insérer, en les insérant en gros lots.