Maison  >  Article  >  développement back-end  >  Comment résoudre le problème de l'enregistrement simultané d'une grande quantité de données dans la base de données en PHP

Comment résoudre le problème de l'enregistrement simultané d'une grande quantité de données dans la base de données en PHP

小云云
小云云original
2018-03-15 09:10:511782parcourir

Les insertions de base de données peuvent être mises à jour par lots. Lorsqu'une grande quantité de données est insérée de manière cyclique, les données peuvent être conservées sans exécuter la commande d'insertion et le dernier élément peut être inséré en une seule fois, comme la méthode addAll(). de tp;

La mise à jour de la base de données peut également être mise à jour par lots si le cas échéant est utilisé. J'ai trouvé une méthode saveAll() basée sur tp sur Baidu, qui est utilisée pour mettre à jour les données

Cet article. parle principalement de l'insertion par lots ;

Exemple :

Générer une commande

L'instruction normale est :

INSERT INTO order (`goods_id`,`num`,`price`) VALUES (1,1,'10.00');
//封装成函数
function add_order($goods_id,$num,$price){
$db->query("INSERT INTO order (`goods_id`,`num`,`price`) VALUES ($goods_id,$num,$price)");
}

Supposons qu'il y ait un utilisateur qui place 1 000 articles dans le panier en même temps Lorsque le produit est réglé dans une commande et que 1 000 commandes sont générées

for ($i=0;$i<1000;$i++){
$db->query("INSERT INTO order (`goods_id`,`num`,`price`) VALUES ($goods_id,$num,$price)");
}
//这样的话会导致服务器资源占用过大,网站卡死
//所以,我们可以
$sql = "INSERT INTO order (`goods_id`,`num`,`price`) VALUES ";
for ($i=0;$i<1000;$i++){
    if($i==0){
    $sql.="($goods_id,$num,$price)";
    }else{
    $sql.=",($goods_id,$num,$price)";
    }
}
$db->query($sql);

C'est un peu plus compliqué de mettre en œuvre la mise à jour par lots, donc je ne le ferai pas. envoyez-le. Ce qui suit est l'instruction d'exécution SQL pour la mise à jour par lots

UPDATE tiyan.dm_user_cupboard SET `res_id` = CASE `id` WHEN 1041 THEN '1' WHEN 1058 THEN '1' WHEN 1055 THEN '1'. END,`food_code` = CASE `id` QUAND 1041 PUIS '68' QUAND 1058 PUIS '47' QUAND 1055 PUIS '49' END,`food_name` = CASE `id` QUAND 1041 PUIS 'Dates rouges' QUAND 1058 PUIS 'Lotus root' QUAND 1055 PUIS 'Oignon' FIN,`num` = CASE `id` QUAND 1041 PUIS '2' QUAND 1058 PUIS '3' QUAND 1055 PUIS '2' FIN,`level` = CASE `id` QUAND 1041 ALORS ' 2' QUAND 1058 PUIS '2' QUAND 1055 PUIS '2' END,`update_time` = CASE `id` QUAND 1041 PUIS '2017-12-09 21:40:06' QUAND 1058 PUIS '2017-12-09 21 : 40:06' WHEN 1055 THEN '2017-12-09 21:40:06' END WHERE id IN ( 1041,1058,1055 )

Livré avec saveAll() basé sur tp

//批量更新
public function saveAll($datas,$model){
    ( $model || $model=$this->tableName);
    $model=empty($model)?$this->name:$model;
    $sql   = ''; //Sql
    $lists = []; //记录集$lists
    $pk    = $this->getPk();//获取主键
    foreach ($datas as $data) {
        foreach ($data as $key=>$value) {
            if($pk===$key){
                $ids[]=$value;
            }else{
                $lists[$key].= sprintf("WHEN %u THEN '%s' ",$data[$pk],$value);
            }
        }
    }
    foreach ($lists as $key => $value) {
        $sql.= sprintf("`%s` = CASE `%s` %s END,",$key,$pk,$value);
    }
    $sql = sprintf('UPDATE __%s__ SET %s WHERE %s IN ( %s )',strtoupper($model),rtrim($sql,','),$pk,implode(',',$ids));
    return M()->execute($sql);
}

Recommandations associées :

Avant que les données php ne soient stockées dans la base de données Nettoyez et notez que la plage de valeurs int de php intval et mysql est différente_Tutoriel PHP

Explication détaillée d'exemples simples de programmes de collecte et d'entreposage de données basés sur PHP

Programme simple de collecte et de stockage de données basé sur PHP, tutoriel de collecte et de stockage php_PHP

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn