10
votes

Accélérer un grand nombre de mises à jour et d'insertions MySQL

J'ai une application qui doit mettre à jour une grande quantité de données sur un grand nombre d'entrées. Fondamentalement, cela fait quelque 7 000 inserts et / ou mises à jour, mais il faut un temps de looooong (comme près de 9 minutes ... en moyenne environ 0,08 seconde par requête). Je cherche essentiellement des onduleurs généraux pour faire plusieurs demandes de telles demandes (je ne m'attends pas à une réponse spécifique à mon exemple vague ... c'est juste pour, espérons-le, aider à expliquer).

Voici quelques échantillons de profilage de la Demandes: P>

foreach ($foo as $bar)
{
    if ($bar['timestamp'] == $baz) // where $baz is the needed timestamp
    {
    // do the insert here
    }
}


0 commentaires

4 Réponses :


16
votes

quelques liaisons utiles:

  • 32 conseils pour accélérer vos requêtes MySQL
  • Sur la cache de requête MySQL pour accélérer la performance de la requête?
  • Plusieurs inserts dans une requête unique - PHP / MYSQL
  • 3 façons de vitesse MySQL

    de la documentation MySQL:

    vitesse des instructions d'insertion dit:

    • Si vous insérez de nombreuses lignes du même client en même temps, utilisez Insérer des instructions avec plusieurs valeurs Listes pour insérer plusieurs rangées à un temps. Ceci est considérablement plus rapide (plusieurs fois plus vite dans certains cas) que Utilisation d'un insert séparé à une rangée déclarations. Si vous ajoutez des données à une table non vide, vous pouvez régler le bulk_insert_buffer_size variable à rendre une insertion de données encore plus rapide.

    • Si plusieurs clients inséraient beaucoup de lignes, vous pouvez obtenir une vitesse supérieure en utilisant l'instruction insertion retardée.

    • pour une table myisam, vous pouvez utiliser des inserts simultanés pour ajouter des lignes à la même temps que les déclarations sélectionnées sont courir, s'il n'y a pas de lignes supprimées Au milieu du fichier de données.

    • Lors du chargement d'une table à partir d'un fichier texte, utilisez l'infiltration de données de charge. C'est généralement 20 fois plus rapide que d'utiliser Insérer des relevés.

    • Avec un travail supplémentaire, il est possible de faire fonctionner des données de charge même plus rapide pour une table myisam quand le la table a de nombreux index.


0 commentaires

2
votes

Si vous n'êtes pas déjà, utilisez des instructions préparées (via mysqli , PDO ou une autre bibliothèque de DB qui les prend en charge). Réutiliser la même déclaration préparée et simplement la modification des valeurs de paramètre aidera à accélérer les choses, car le serveur MySQL n'a qu'à analyser la requête une fois.

insert S peut être associé en fournissant plusieurs ensembles de valeurs - une seule requête qui insère de nombreuses lignes est beaucoup plus rapide qu'un nombre équivalent de requêtes individuelles chaque insertion d'une rangée .


0 commentaires

2
votes

Ce que vous suggérez est correct. Essayez de réduire la quantité de requêtes que vous envoyez au serveur car cela vous permettra de vous sauvegarder à partir des multiples générales de communication.

Bien sûr, si la requête initée à distance redevient trop de données, vous pouvez avoir un goulot d'étranglement sur PHP.


0 commentaires

1
votes

J'utiliserais probablement une procédure stockée si possible et appelez-le de mon code d'application. En outre, je penserais à une indexation correcte et j'ajouterais peut-être une clé de substitution de remplacement basée sur des entiers pour Planet_ID sous la forme d'une clé de caractère de 13 octets n'allant pas être réalisée dans des jointures et des recherches comme un entier d'octet.

(i Je viens de lire que des planètes habitables sont estimées à 10 millions de milliards de milliards de dollars dans l'univers, alors peut-être que vous feriez peut-être mieux d'utiliser Bigint non signé: p) xxx


1 commentaires

"10 millions de trillions" - 10 quintillion :)