Je suis un étudiant diplômé de recherche OLAP avec Mondrian OLAP. Je veux donc insérer des données dans InnoDB (MySQL 5.5) plus rapidement lors du chargement initial. Dans cet environnement, le seul utilisateur est moi, donc je pense que je peux autoriser des paramètres plus lâches pour la vitesse d'insertion. Pour le moment, j'utilise les techniques suivantes.
- désactiver
log_bin
- activer
skip-innodb-doublewrite
- réglé
transaction_isolation
surREAD-COMMITTED
ouREAD-UNCOMMITTED
(en faitREAD-COMMITED
) - réglé
innodb_flush_log_at_trx_commit
sur0
ou2
(en fait0
) - réglé
innodb_buffer_pool_size
sur 5 Go (le système a 6 Go de RAM)
Existe-t-il d'autres techniques pour une insertion plus rapide sur InnoDB? Et dois-je modifier innodb_io_read_thread
et innodb_io_write_thread
? Si vous avez besoin de plus d'informations, dites-le moi.
innodb_read_io_threads
,innodb_write_io_threads
et `innodb_io_capacity ».Il existe un document entier dédié au chargement en masse des données dans InnoDB. Les points principaux:
SET autocommit=0;...sql import;COMMIT;
désactiver les contrôles étrangers et uniques (vous ne pouvez pas désactiver complètement tous les index):
Le troisième peut ou non vous aider, je vous suggère donc de lire ce lien pour voir comment vous chargez initialement les données. Par exemple, si vous divisez les charges en plusieurs insertions pour qu'elles s'exécutent simultanément, cela vous aidera certainement à définir la valeur sur 2. Si vous effectuez une grande insertion multi-lignes, cela ne fera pas grand-chose (le cas échéant) pour Aidez-moi.
Puisque vous désactivez le journal binaire pour cette insertion initiale, vous ne devez pas vous soucier des lacunes dans les nombres d'auto-incrémentation (si vous effectuez des insertions simultanées).
la source
Vous pouvez utiliser les méthodes suivantes pour accélérer les insertions:
INSERT
instructions avec plusieursVALUES
listes pour insérer plusieurs lignes à la fois. Ceci est considérablement plus rapide (plusieurs fois plus rapide dans certains cas) que l'utilisation d'INSERT
instructions séparées sur une seule ligne . Si vous ajoutez des données à une table non vide, vous pouvez régler la variable bulk_insert_buffer_size pour accélérer l'insertion des données.LOAD DATA INFILE
. Ceci est généralement 20 fois plus rapide que l'utilisation d'INSERT
instructions. Voirla source
Plan A: INSERT "en lot" - plusieurs lignes par instruction INSERT. Suggérez environ 1000 lignes par instruction. autocommit = on, pas de COMMENCEMENT explicite ... COMMIT
Plan B: CHARGER LES DONNÉES
Si vous insérez trop de lignes à la fois, InnoDB doit faire plus de travail pour pouvoir annuler l'insertion en cas de plantage. Pour cette raison, je suis en désaccord avec autocommit = off, qui mettrait l'ensemble entier en une seule transaction.
LOAD DATA de l'ensemble des lignes pourrait avoir le même problème, mais c'est assez rapide.
buffer_pool = 5G sur 6G est sur le point d'être trop gros. S'il y a un échange, les performances chuteront.
Le partitionnement ralentirait probablement le processus.
AFFICHER CRÉER UN TABLEAU - Les clés secondaires peuvent être un sérieux handicap.
Utilisez-vous InnoDB? ou XtraDB?
la source
LOAD DATA
soit si rapide, mais nous devons écrire des données sur du texte en même temps au format CSV, puis les utiliserLOAD DATA
? / Je vais régler lebuffer_pool_size
à 4 Go.