Je passe un grand ensemble de données dans une table MySQL via PHP à l'aide de commandes d'insertion et je me demande s'il est possible d'insérer environ 1000 lignes à la fois via une requête autre que d'ajouter chaque valeur à la fin d'une chaîne d'un kilomètre de long, puis l'exécuter. J'utilise le framework CodeIgniter donc ses fonctions sont également disponibles pour moi.
php
mysql
codeigniter
insert
bulkinsert
trop loin
la source
la source
Réponses:
L'assemblage d'une
INSERT
instruction avec plusieurs lignes est beaucoup plus rapide dans MySQL qu'uneINSERT
instruction par ligne.Cela dit, il semble que vous rencontriez peut-être des problèmes de gestion des chaînes en PHP, ce qui est vraiment un problème d'algorithme, pas un problème de langage. Fondamentalement, lorsque vous travaillez avec de grandes chaînes, vous voulez minimiser les copies inutiles. Cela signifie principalement que vous souhaitez éviter la concaténation. Le moyen le plus rapide et le plus efficace en termes de mémoire pour créer une chaîne volumineuse, par exemple pour insérer des centaines de lignes en une, consiste à tirer parti de l'
implode()
affectation des fonctions et des tableaux.L'avantage de cette approche est que vous ne copiez pas et ne recopiez pas l'instruction SQL que vous avez jusqu'à présent assemblée avec chaque concaténation; à la place, PHP le fait une fois dans l'
implode()
instruction. C'est une grande victoire.Si vous avez beaucoup de colonnes à assembler et qu'une ou plusieurs sont très longues, vous pouvez également créer une boucle interne pour faire la même chose et l'utiliser
implode()
pour affecter la clause values au tableau externe.la source
mysql_real_escape_string
avecmysqli_real_escape_string
etmysql_query
avecmysqli_query
car j'utilise MySQLi et ceux-ci sont obsolètes à partir de PHP5. Merci beaucoup!mysql_*
a été supprimé de PHP, assurez-vous donc d'utiliser l'mysqli_*
interface.L'insertion multiple / par lots est désormais prise en charge par codeigniter. J'ai eu le même problème. Bien qu'il soit très tard pour répondre à la question, cela aidera quelqu'un. C'est pourquoi répondre à cette question.
la source
Vous pouvez préparer la requête pour insérer une ligne à l'aide de la classe mysqli_stmt, puis effectuer une itération sur le tableau de données. Quelque chose comme:
Où «idsb» correspond aux types de données que vous liez (int, double, string, blob).
la source
Je sais que c'est une vieille requête, mais je lisais juste et j'ai pensé ajouter ce que j'ai trouvé ailleurs:
mysqli en PHP 5 est un ojbect avec quelques bonnes fonctions qui vous permettront d'accélérer le temps d'insertion de la réponse ci-dessus:
La désactivation de l'autocommit lors de l'insertion de nombreuses lignes accélère considérablement l'insertion, alors désactivez-la, puis exécutez-la comme mentionné ci-dessus, ou créez simplement une chaîne (sqlCombined) qui comprend de nombreuses instructions d'insertion séparées par des points-virgules et les requêtes multiples les géreront correctement.
J'espère que cela aidera quelqu'un à gagner du temps (recherche et insertion!)
R
la source
Vous pouvez toujours utiliser mysql
LOAD DATA
:pour faire des insertions en masse plutôt que d'utiliser un tas d'
INSERT
instructions.la source
LOCAL
bit.Eh bien, vous ne voulez pas exécuter 1000 appels de requête, mais cela convient parfaitement:
Selon votre source de données, remplir le tableau peut être aussi simple que d'ouvrir un fichier et de vider le contenu dans un tableau via
file()
.la source
la source
Vous pouvez le faire de plusieurs façons dans codeigniter, par exemple
la source
Bien qu'il soit trop tard pour répondre à cette question. Voici ma réponse sur le même.
Si vous utilisez CodeIgniter, vous pouvez utiliser des méthodes intégrées définies dans la classe query_builder.
$ this-> db-> insert_batch ()
Génère une chaîne d'insertion basée sur les données que vous fournissez et exécute la requête. Vous pouvez passer un tableau ou un objet à la fonction. Voici un exemple utilisant un tableau:
);
Le premier paramètre contiendra le nom de la table, le second est un tableau associatif de valeurs.
Vous pouvez trouver plus de détails sur query_builder ici
la source
J'ai créé une classe qui exécute plusieurs lignes qui est utilisée comme suit:
où la classe est définie comme suit:
la source
Utilisez insérer un lot dans codeigniter pour insérer plusieurs lignes de données.
la source
J'ai créé cette fonction simple que vous pouvez utiliser facilement. Vous devrez passer le nom de la
($tbl)
table, le champ de la table par($insertFieldsArr)
rapport à vos données d'insertion, tableau de données($arr)
.la source