2011-07-23 11 views
7

Metin dosyalarından bazı verileri MySQL veritabanına alan bir PHP betiği oluşturuyorum. Bu metin dosyaları oldukça büyüktür, ortalama bir dosyada her biri veritabanımda istediğim yeni bir öğeye karşılık gelen 10.000 satır olacaktır. Bir INSERT sorgusu yapıyor sonra dosyadan bir satır okuyarak ve üst üste 10,000 kez bazı sorunlara neden olabileceğinden korkuyorumVeritabanı sorgularımı oran sınırlaması mı yoksa azalt mı?

(Çok sık dosyalarını içe edilmeyecektir). Bunu yapmamın daha iyi bir yolu var mı? 10.000 değerindeki bir INSERT sorgusu yapmalı mıyım? Yoksa bu kadar kötü mü?

Belki orta ulaşır ve aynı anda 10 veya 100 girdileri gibi bir şey yapabilirsiniz. Gerçekten benim sorunum, iyi uygulamaların ne olduğunu bilmem. Belki üst üste 10.000 sorgu iyidir ve sadece hiçbir şey için endişeleniyorum.

Herhangi bir öneriniz var mı?

cevap

6

evet

<?php 
$lines = file('file.txt'); 
$count = count($lines); 
$i = 0; 
$query = "INSERT INTO table VALUES "; 
foreach($lines as $line){ 
    $i++; 
    if ($count == $i) { 
     $query .= "('".$line."')"; 
    } 
    else{ 
     $query .= "('".$line."'),"; 
    } 
} 
echo $query; 

http://sandbox.phpcode.eu/g/5ade4.php

bu hızlı tek satırlık-tek sorgu tarzı daha katıdır tek sorgu yapacak olan!

+0

+1 Güzel şeyler, beğen. – Mattis

+0

teşekkürler! Daha büyük bir sorgu iyi bir fikir gibi görünüyor! – nate

+3

Ancak dikkatli olun, çünkü sorgunun boyutu sunucu için max_allowed_packet parametrenizden daha az olmalıdır! (bkz. my.ini) – spacediver

2

Tüm değerleri bir defada büyük bir sorguda yapardım. Ancak emin olmak için, önceve COMMIT;'u çalıştırdığınızdan emin olun, böylece sorgulama işlemi sırasında bir şeyler ters giderse (ki bu da büyük olasılıkla oldukça uzun bir süre için çalışacaktır) veritabanı etkilenmez.

+0

Birden çok ekleme yapmanın, hataları izleme yeteneğinizi azaltacağını unutmayın. satırlardan biri ekleme başarısız olursa, hangi hatayı tetiklediğini algılayamazsınız (ve en azından iyi olanlara sahip olmak yerine tüm toplu iş işini bırakacaktır) – marcelog

+0

Doğru. Eklenen tüm verilerin aklı başında olduğunu varsayıyorum, bu yüzden hiçbir satır eklenemez. Bundan emin olmak için sorgu dizesine eklenmeden önce verilerde doğrulama yapılmalıdır. – EdoDodo

+0

IMNSHO, tüm işlemin kaybedilmesi işlenmekte olan kısmi bir işlem için tercih edilir. Doğrulamanın bir sorun olması muhtemelse, tek bir işlem çerçevesinde, örneğin geçici bir tabloya ekleyerek, yeni verilerle çelişen satırlar için var olan veriler arasında sorgulama yapıp ardından veri aktarımı yapmayı denerdim. Her şey A-Tamam olduğundan emin olunca geçici masadan ana masaya. Bu her iki dünyanın en iyisi olurdu (biraz daha fazla kod karmaşıklığı pahasına) – SingleNegationElimination

5

Kullanım Yüksek Performanslı MySQL yazarları tarafından önerilen, ifadeleri hazırladı. Çok zaman kazandırır (savurgan protokolden ve SQL ASCII kodundan tasarruf sağlar).

+0

Ah güzel! Böyle bir şey hakkında hiçbir fikrim yoktu.Çözeceğim. ithalatım için hazırlanmış ifadeleri kullan. Teşekkürler! – nate

İlgili konular