Heim  >  Artikel  >  Backend-Entwicklung  >  So lösen Sie das Problem der gleichzeitigen Protokollierung großer Datenmengen in der Datenbank in PHP

So lösen Sie das Problem der gleichzeitigen Protokollierung großer Datenmengen in der Datenbank in PHP

小云云
小云云Original
2018-03-15 09:10:511785Durchsuche

Datenbankeinfügungen können in Stapeln aktualisiert werden, wenn eine große Datenmenge zyklisch eingefügt wird, können die Daten beibehalten werden, ohne dass der Einfügungsbefehl ausgeführt werden muss, und das letzte Element kann auf einmal eingefügt werden, z. B. mit der Methode addAll() von tp;

Datenbankaktualisierung kann auch stapelweise aktualisiert werden, wenn ich eine auf tp basierende Methode saveAll() auf Baidu gefunden habe, die zum Aktualisieren von Daten verwendet wird.

Dieser Artikel Hauptsächlich geht es um Batch-Einfügung;

Beispiel:

Eine Bestellung generieren

Die normale Aussage lautet:

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)");
}

Angenommen, es gibt einen Benutzer, der etwas aufgibt 1.000 Artikel auf einmal im Warenkorb Wenn das Produkt in einer Bestellung abgerechnet wird und 1.000 Bestellungen generiert werden; Das bedeutet, dass die Implementierung einer Stapelaktualisierung etwas schwieriger ist, also habe ich gewonnen Es wird nicht gesendet. Das Folgende ist die SQL-Ausführungsanweisung für die Stapelaktualisierung

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);
UPDATE tiyan.dm_user_cupboard SET `res_id` = CASE `id` WHEN 1041 THEN '1' WHEN 1058 THEN '1' WHEN 1055 THEN ' 1' ENDE,`food_code` = CASE `id` WENN 1041 DANN '68' WENN 1058 DANN '47' WENN 1055 DANN '49' ENDE,`food_name` = CASE `id` WENN 1041 DANN 'Rote Datteln' WANN 1058 DANN 'Lotuswurzel' WENN 1055 DANN 'Zwiebel' ENDE,`num` = CASE `id` WENN 1041 DANN '2' WENN 1058 DANN '3' WENN 1055 DANN '2' ENDE,`level` = CASE `id` WENN 1041 DANN '2', WENN 1058, DANN '2', WENN 1055, DANN '2' ENDE,`update_time` = CASE `id`, WENN 1041, DANN '2017-12-09 21:40:06', WENN 1058, DANN '2017-12-09 21:40:06' WHEN 1055 THEN '2017-12-09 21:40:06' END WHERE id IN ( 1041,1058,1055 )

Kommt mit tp-basiertem saveAll()

Verwandte Empfehlungen:

//批量更新
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);
}

Bevor PHP-Daten in der Datenbank gespeichert werden, bereinigen Sie und beachten Sie, dass der int-Wertebereich von PHP Intval und MySQL unterschiedlich ist_PHP-Tutorial

Detaillierte Erläuterung einfacher Beispiele für Datenerfassungs- und -speicherungsprogramme auf Basis von PHP

Einfaches Datenerfassungs- und -speicherprogramm auf Basis von PHP, PHP-Erfassung und -Speicherung_PHP-Tutorial

Das obige ist der detaillierte Inhalt vonSo lösen Sie das Problem der gleichzeitigen Protokollierung großer Datenmengen in der Datenbank in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn