10.14 Facteur affectant la vitesse des INSERT

Le temps nécessaire pour insérer une ligne comprend :

  • Connexions: (3)
  • Envoi de la requête au serveur: (2)
  • Analyse la requête: (2)
  • Insertion de la ligne record: (1 x size of record)
  • Insertion indexes: (1 x indexes)
  • Terminaison: (1)

Le (nombre) est proportonnel au temps.. Le détail ci-dessus ne prend pas en compte le temps d'ouverture initial des tables (qui sera fait à chaque nouvel accès d'une requête).

Ma taille d'une table ralenti l'insertion des index au rythme de N log N (B-tree).

Vous pouvez accélèrer les insertions en verrouillant votre table et/ou en utilisant des insertions multiples. Les insertions multiples peuvent être jusqu'à 5 fois plus rapides que des insertions séparées :

mysql> LOCK TABLES a WRITE;
mysql> INSERT INTO a VALUES (1,23),(2,34),(4,33);
mysql> INSERT INTO a VALUES (8,26),(6,29);
mysql> UNLOCK TABLES;

La principale différence vient du fait que le buffer d'index est écrit sur le disque une seule fois, après toutes les insertions. Dans l'autre cas, il y aurait de nombreuses écritures sur le disque, une par commande INSERT. Le verrouillage n'est pas nécessaire si vous pouvez insérer toutes les lignes dans une seule commande d'insertion.

Le verrouillage va aussi réduire le nombre de test de connexions multiples, mais il va aussi augmenter le temps d'attente des autres threads. Par exemple :

thread 1 does 1000 inserts
thread 2, 3, and 4 does 1 insert
thread 5 does 1000 inserts

Si vous n'utilisez pas le verrouillage, , 2, 3 et 4 vont s'achever avant 1 et 5. Si vous utilisez le verrouillage, 2, 3 et 4 ne vont probablement pas finir avant 1 ou5, mais le temps total devrait être réduit de 40%.

Etant donné que les commandes INSERT, UPDATE et DELETE sont extrêmement rapide sous MySQL, vous obtiendrez une performance générale accrue si vous utilisez le verrouillage dès que vous mettez en jeu plus de 5 commandes. Vous pouvez aussi déverrouiller et reverrouiller une table de temps à autre (si vous inserez énormément de lignes, par exemple), pour donner un peu de temps aux autres threads. Cela peut fournir un gain significatif de performances.

Bien entendu, LOAD DATA INFILE est toujours le plus efficace.

Si vous insérez de nombreuses lignes de différents clients, vous pouvez accélérer la procédure en utilisant l'option INSERT DELAYED. INSERT.