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
}
}
4 Réponses :
de la documentation MySQL: strong> p>
vitesse des instructions d'insertion dit: p>
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. p> li>
Si plusieurs clients inséraient beaucoup de lignes, vous pouvez obtenir une vitesse supérieure
en utilisant l'instruction insertion retardée. p> li>
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. P> li>
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. P> li>
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. P> li>
ul>
blockQuote>
Si vous n'êtes pas déjà, utilisez des instructions préparées (via mysqli code>, PDO code> 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. P>
insert code> S peut être associé en fournissant plusieurs ensembles de valeurs code> - 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 . p>
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. P>
Bien sûr, si la requête initée à distance redevient trop de données, vous pouvez avoir un goulot d'étranglement sur PHP. P>
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) p>
"10 millions de trillions" i> - 10 quintillion :)