Php kullanarak MySQL veritabanı veri Toplu ekleme

3 Cevap php

PHP ve MySQL kullanarak veritabanı tabloya eklenecek büyük XML çözümlü veri binlerce var. Benim Sorun bu tabloya tüm veri eklemek için çok uzun sürer. Yerleştirme süreci grup tarafından böylece benim veri küçük gruba bölünmüş bir yolu var mı? Nasıl, örneğin 100 ile verileri işleyecek bir komut dosyası kurabilirsiniz? İşte benim kod:

foreach($itemList as $key => $item){
     $download_records  = new DownloadRecords();
	//check first if the content exists
	if(!$download_records->selectRecordsFromCondition("WHERE Guid=".$guid."")){
         /* do an insert here */
    } else {
         /*do an update */
    }

}

* Not: $ ItemList etrafında 62,000 ve hala büyüyor.

3 Cevap

Döngüsü için kullanma?

Fakat MySQL veri yüklemek için hızlı seçenek PHP üzerinden yüklemek için dosyası oluşturabilirsiniz, LOAD DATA INFILE komutunu kullanın ve sonra farklı bir süreç aracılığıyla MySQL onu beslemek (ya da orijinal bir son adım olarak için süreci).

Bir dosyayı kullanamıyorsanız, aşağıdaki sözdizimini kullanın:

insert into table(col1, col2) VALUES (val1,val2), (val3,val4), (val5, val6)

böylece çalıştırmak cümlelerin toplam tutarı azaltır.

EDIT: pasajı önüne alındığında, bu veritabanı işi icar ve sorguların miktarını azaltarak, MySQL INSERT ... ON DUPLICATE KEY UPDATE sözdizimi yararlanabilir görünüyor. Bu tablo, birincil anahtar veya benzersiz dizin vardır varsayar.

DB gibi bir şey yapabilirsiniz, her 100 satırları vurmak (PLEASE REVIEW IT AND FIX IT TO YOUR ENVIRONMENT)

$insertOrUpdateStatement1 = "INSERT INTO table (col1, col2) VALUES ";
$insertOrUpdateStatement2 = "ON DUPLICATE KEY UPDATE ";
$counter = 0;
$queries = array();

foreach($itemList as $key => $item){
    $val1 = escape($item->col1); //escape is a function that will make 
                                 //the input safe from SQL injection. 
                                 //Depends on how are you accessing the DB

    $val2 = escape($item->col2);

    $queries[] = $insertOrUpdateStatement1. 
    "('$val1','$val2')".$insertOrUpdateStatement2.
    "col1 = '$val1', col2 = '$val2'";

    $counter++;

    if ($counter % 100 == 0) {
        executeQueries($queries);
        $queries = array();
        $counter = 0;
    }
}

Ve executeQueries dizi kapmak ve tek bir çoklu sorgu göndermek istiyorsunuz:

function executeQueries($queries) {
   $data = "";
     foreach ($queries as $query) {
        $data.=$query.";\n";
    }
    executeQuery($data);
}

Evet, sadece yapmak için beklediğiniz ne.

Eğer yerine cron çalışan vs varsa, olabilir, (bir toplu iş pick up ve koşmak bir yere dosya açılır ve bir cini veya cron var vs bir zaman aşımı isabet olabileceğini düşünüyorsanız bir web uygulaması toplu ekleme yapmak için denemek gerekir yalnızca bir örnek) bir kerede çalışır emin olun.

Dediğim gibi, zaman aşımı (veya kullanıcı kaybetmeden ağ) önlemek için, dosyaları işlemek için bir cron ile bir geçici dizine önce koymak gerekir.

Yüklenenler için sadece web kullanın.

Eğer gerçekten bir web isteği üzerine DB almak istiyorsanız, bir toplu ekleme yapmak veya hızlı olmalı, en az bir işlem kullanabilir ya.

Sonra (bir sayaç sayısı% 100 == 0 olup olmadığını trasnsaction uygulanıyor) ve tüm satırlar takıldı kadar tekrarlayın 100 gruplar tarafından ekler sınırlandırılması için.