mysql içine php dizi ile birden fazla satır eklemek

6 Cevap php

Daha sonra bir kilometre uzunluğunda bir dize sonunda her değer ekleme ve başka bir sorgu ile ben insert komutlarını kullanarak php üzeri mysql tabloya büyük bir veri kümesi geçen kulüpler ve mümkünse ben bir seferde yaklaşık 1000 satır eklemek için merak ediyorum yürütmeden. Işlevleri de benim için kullanılabilir böylece ben CodeIgniter framework kullanarak duyuyorum.

6 Cevap

Birden fazla satır ile bir INSERT bildirimde montajı çok daha hızlı MySQL satır başına bir INSERT deyimi daha.

Eğer gerçekten bir algoritma sorun değil, bir dil biridir PHP, string işleme sorunlar haline çalışıyor olabilir gibi geliyor, dedi. Büyük dizeleri ile çalışırken Temelde, gereksiz kopyalama en aza indirmek istiyoruz. Öncelikle, bu birleştirme kaçınmak istediğiniz anlamına gelir. Böyle birinde satırlar yüzlerce ekleme gibi büyük bir dize oluşturmak için en hızlı ve en verimli bir şekilde bellek, implode() fonksiyon ve dizi atama yararlanmak etmektir.

$sql = array(); 
foreach( $data as $row ) {
    $sql[] = '("'.mysql_real_escape_string($row['text']).'", '.$row['category_id'].')';
}
mysql_query('INSERT INTO table (text, category) VALUES '.implode(',', $sql));

Bu yaklaşımın avantajı, kopyalama ve şimdiye kadar her birleştirme ile monte ettik SQL deyimini yeniden kopya yok olduğunu; Bunun yerine, PHP implode() açıklamada bu once yapar. Bu big kazançtır.

Eğer bir araya getirmek için sütunların çok olması, ve bir veya daha çok uzun ise, siz de aynı şeyi yapmak ve implode() dış diziye değerler fıkra atamak için kullanılacak bir iç döngü kurmak olabilir.

Çoklu ekleme / toplu insert şimdi CodeIgniter tarafından desteklenmektedir. Ben aynı sorunu vardı. Bu soruyu yanıtlamak için çok geç olmasına rağmen, birileri yardımcı olacaktır. Bu soruyu yanıtlarken yüzden.

$data = array(
   array(
      'title' => 'My title' ,
      'name' => 'My Name' ,
      'date' => 'My date'
   ),
   array(
      'title' => 'Another title' ,
      'name' => 'Another Name' ,
      'date' => 'Another date'
   )
);

$this->db->insert_batch('mytable', $data);

// Produces: INSERT INTO mytable (title, name, date) VALUES ('My title', 'My name', 'My date'), ('Another title', 'Another name', 'Another date')

Sen mysqli_stmt sınıfını kullanarak bir satır eklemek için sorguyu hazırlamak ve daha sonra veri dizisini tekrarlayabilirsiniz. Gibi bir şey:

$stmt =  $db->stmt_init();
$stmt->prepare("INSERT INTO mytbl (fld1, fld2, fld3, fld4) VALUES(?, ?, ?, ?)");
foreach($myarray as $row)
{
    $stmt->bind_param('idsb', $row['fld1'], $row['fld2'], $row['fld3'], $row['fld4']);
    $stmt->execute();
}
$stmt->close();

Nerede 'İDSB' Bunu (int, double, string, blob) bağlama konum verilerinin türleridir.

Eh, 1000 sorgu aramaları yürütmek istiyorum, ama bunu yaparken gayet yok:

$stmt= array( 'array of statements' );
$query= 'INSERT INTO yourtable (col1,col2,col3) VALUES ';
foreach( $stmt AS $k => $v ) {
  $query.= '(' .$v. ')'; // NOTE: you'll have to change to suit
  if ( $k !== sizeof($stmt)-1 ) $query.= ', ';
}
$r= mysql_query($query);

Veri kaynağına bağlı olarak, dizi doldurma bir dosyayı açma ve file() aracılığıyla bir diziye içeriğinin dökümüne kadar kolay olabilir.

Her zaman mysql kullanalım LOAD DATA olabilir:

LOAD DATA LOCAL INFILE '/full/path/to/file/foo.csv' INTO TABLE `footable` FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n'

yerine INSERT tabloların bir demet kullanarak daha toplu ekler yapmak.

Bu eski bir sorgu olduğunu biliyorum, ama ben sadece okuma ve ben başka bir yerde ne buldum eklemek düşündüm edildi:

PHP 5 mysqli yukarıda cevap için ekleme zamanı hızlandırmak sağlayacak bazı iyi fonksiyonları ile bir ojbect olduğunu:

$mysqli->autocommit(FALSE);
$mysqli->multi_query($sqlCombined);
$mysqli->autocommit(TRUE);

Birçok satır eklerken autocommit kapatarak büyük ölçüde ekleme hızlandırır, böylece, onu kapatmak yukarıda belirtildiği gibi o yürütmek, ya da sadece yarı-iki nokta üst üste ve çok sorgu ile ayrılan birçok ekleme tümcecikleridir onları iyi idare edecek bir dize (sqlCombined) yapmak.

Bu Birisi zamandan tasarruf yardımcı olur umarım (arama ve ekleme!)

R