2009-02-23 31 views
6

PHP Data Object işlevlerinde ciddi sorunlar yaşıyorum. Tüm kümeyi almaktan kaçınmak için tamponlu bir sorgu kullanarak büyük bir sonuç kümesi (~ 60k satır, ~ 1gig) arasında geçiş yapmaya çalışıyorum.PHP PDO Arabellenmiş sorgu sorunu

Ne yaptığım önemli değil, komut dosyası yalnızca PDO :: query() üzerinde duruyor - sorgu çalışılmıyor gibi görünüyor (neden sonuç kümesindeki değişiklik 'sorunu düzeltmeniz gerekiyor?). İşte sorunu yeniden benim kodudur: Bazı makul sayıda sorgu sınırlamak durumunda

, iyi çalışıyor:

$rQuery = $Database->query('SELECT id FROM mytable LIMIT 10'); 

ben PDO :: MYSQL_ATTR_MAX_BUFFER_SIZE ile oynayan ve PDO kullanarak denedi :: ready() ve PDO :: execute() da (yukarıdaki sorguda herhangi bir parametre olmasa da), hem boşuna hem de. Herhangi bir yardım takdir edilecektir.

cevap

8

Bu hakkı anlıyorsam, arabelleğe alınmış sorgular, PHP'ye işlem yapmaya başlamadan önce tüm sonuç kümesini beklemek istediğinizi bildirmesini içerir. PDO'dan önce, bu varsayılan değerdi ve sonuçlarla hemen ilgilenmek istediğinizde mysql_unbuffered_query'u aramanız gerekiyordu.

Neden bu, PDO MySQL sürücü sayfasında açıklanmıyor, bilmiyorum.

+0

Vay tamam ben bir aptalım her satır yerine fetch()fetchAll() kullanmak için bir izlenim bırakıyor beri

while ($row = mysql_fetch_row($query)) { ... } 

Hangi kesinlikle daha hızlı olacaktır . Bana tam tersi izlenimi verdiğini bilmiyorum. – Stewart

+0

Teknik olarak, bir "arabelleğe alınmış" sorgusu, MySQL istemci kütüphanesinin, tüm sonuçları kendinize geri göndermeden önce TCP akışından çekmesi anlamına gelir. – staticsan

+0

Hmm, bu kılavuzun arabelleğe alınmış/arabelleğe alınmamış (mysql stili) ve getirme/fetchAll (PDO stili) arasındaki farkı kapsadığını düşündüm, ancak yine de değil. Biraz daha arka plan bilgisi isterseniz, aşağıdaki yararlı bilgileri bulabilirsiniz: http://netevil.org/blog/2008/06/slides-pdo –

1

sorunlarla neden olacak kadar büyük değildir parçalar halinde bölmeli deneyebilirsiniz:

<?php  
$id = 0; 
$rQuery = $Database->query('SELECT id FROM mytable ORDER BY id ASC LIMIT 100'); 

do { 
    stuff($rQuery); 
    $id += 100; 
} while ($rQuery = $Database->query(
      'SELECT id FROM mytable ORDER BY id ASC LIMIT 100 OFFSET '.$id 
     ) 
     ); 
?> 

... Neyse, anladınız.

-1

Ya da belki yerine MySQL fonksiyonları deneyebilirsiniz: o foreach ifadesi

+1

mysql_ işlevleri kullanımdan kaldırıldı ve kullanılmamalıdır – vvondra