MySQL PHP betik ihtiyacı refactor yavaş

3 Cevap php

Merhaba, ben 2 mysql tablolar var ve her ikisi de güncelleştirilmesi gerekiyor

companies
unique_code

Firmalar 1 milyon kayıt tutan ve her biri için asigning benzersiz kodu gerekir, ben sorun benim PHP komut tüm şirketleri kapmak ve foreach döngüsü tablo unique_code ve güncellemeleri eşsiz bir kod kapmak olduğunu, aynı zamanda daha sonra bayrak unique_code tablosunu güncelleştirir kod kullanılmıştır.

PHP kodu sadece yaş için kapatır ve maksimum yürütme sınırı ulaşır. Gerçekten sıkışmış ve bu şirketlerin benzersiz bir kod olması gerekiyor, herkes başka bir yaklaşım düşünebilirsiniz ki?

Kod örneği aşağı stipped.

 foreach ($aCompanies as $companies){

   $query="SELECT * FROM unique_code WHERE used = 0"

   foreach(unique_code as code){
       //  UPdate companies table
       $query = "UPDATE companies SET id = $code";
       // Flag code used
       $query = "UPDATE unique_codes WHERE code = $code";
   }
}

Zaman ayırdığınız için Şerefe.

Komple Kodu:

$query1 = "SELECT code FROM unique_codes WHERE used = 0\n";
$aUniqueCode = $oDbh->getAll($query1);

$query2 = "SELECT id FROM companies";
$aCompanies = $oDbh->getAll($query2);

foreach ($aCompanies as $companies){

    $query = "SELECT code FROM unique_codes WHERE used = '0' LIMIT 1";
    $oCode = $oDbh->getRow($query);

    $query3.= "UPDATE companies SET code = $oCode->code WHERE id = $companies->id\n";   

    $query4 = "UPDATE unique_codes SET used = '1' WHERE code = $oCode->code\n";
    $oDbh->query($query4);      
}
print print_r($query3).';';
exit;

Ne yapıyorum ben bir dosyaya tüm SQL bulunuyor ihraç ediyorum şirketlerin güncellenmesi değildir bu yüzden daha sonraki bir tarihte alabilirsiniz.

3 Cevap

Sadece tabloya yeni bir birincil anahtar (ve bu nedenle bir kez işlem) eklemek için çalışıyorsanız PHP yapmayın. Doğrudan MySQL kullanmak ve işi almak için tabloyu değiştirmek kullanın. MySQL hızlı doğrudan olacak, ve PHP gibi uzun süreçler için zamanlama sorunlarla olmaz.

Başka bir şey yapmaya çalışıyorsanız, bunu ben hedef hakkına sahip olduğunu bana tamamen açık değil, biraz daha tablo şema koymak isteyebilirsiniz.

Belirli alanlarda indekslemesi döndü? Ayrıca gerekli Sorgulamanızda alanları ziyade bütün (*) seçtiğinizden emin olun:

$query="SELECT * FROM unique_code WHERE used = 0"

Bunun yerine:

$query="SELECT field1, field2, field3, etc FROM unique_code WHERE used = 0"

Ben uniuque kod birincil anahtar olduğunu umuyoruz, artı bir birincil anahtar değilse WHERE ile kullanılan alan, endeksli olabilir kontrol edin. T

Nasıl veritabanı darboğaz olduğunu biliyor musunuz? Sen profilleme için Xdebug kullanabilirsiniz, böylece gerçekten şişe boyun nerede olduğunu görmek mümkün olacaktır.

(SEÇ) okurken hafızasında en çok kullanılan nesneleri depolamak ve veritabanı hit azaltabilir böylece Memchace kullanabilirsiniz.