Bu kötü gibi mysql sorguları çalıştırmak için bir PHP sınıfını kullanarak mı?

3 Cevap php

I been looking at some database (MySQL) wrapper classes, A lot of them work like this,
1) Run the sql query
2) while fetching associative mysql array, they cyle through the results and add them to there own array
3) then you would run the class like this below and cycle through it's array

<?php  
$database = new Database();

$result = $database->query('SELECT * FROM user;');

foreach ($result as $user){
    echo $user->username;
}

?>

Yani burada benim soru, bu yüksek trafik türü sitede iyi değil mi? Ben bildiğim kadarıyla söyleyebilirim, mysql o zaman bu diziden yeni bir dizi bina ve ardından yeni dizi aracılığıyla cycleing edilir, bellek yiyor bir dizi dönen çünkü isteyin. Bu normal bir iyi ya da oldukça fazla değil mi?

3 Cevap

Kısa cevap: bu kötü, çok kötü.

Sorun iki kez sonuçlar üzerinde yineleme tarafından kötü bir performans isabet (döngüleri ve hafıza!) Ödemek olduğunu. (Döndürülen 1000 satır varsa ne olacak? Tekrar üzerinde bellekte tüm tutmak, döngü 1000 kere, tüm verileri almak ve daha sonra döngü olur).

Eğer sınıf biraz Refactor eğer hala sorgu sarın ve getir, ancak sorgu dışında fetch_array yapmak isteyeceksiniz edebilirsiniz. Bu durumda, en kısa sürede senin bitmiş gibi bellekteki her satır atmak, bu nedenle tüm sonuç kümesini saklamak gerekmez, ve döngü sadece bir kez.

IIRC, PHP won't load the entire MySQL result set into memory, basically, when you call mysql_fetch_array you're asking for the next row in the set, which is loaded only upon asking for it, so you're not paying the memory hit for the full set (on the PHP side) just by running the original query. Eğer mysql_query (teşekkürler VolkerK) kullandığınızda tüm sonuç belleğe yüklenen alır, ama yine de iki kez CPU maliyet ödeme yapıyorsanız ve bu önemli bir ceza olabilir.

Kod gayet iyi.

foreach () sadece her geçişte dizi hareket ettirir.

Burada bu konuda okuyabilirsiniz:

http://php.net/foreach

Derin bir anlayış için, göstericiler C çalışmak nasıl bakmak:

http://home.netcom.com/~tjensen/ptr/ch2x.htm

Hiçbir şey kopyalanır, yineleme hemen hemen her zaman işaretçileri arttırılmasıyla gerçekleştirilir.

Sorgunun Bu tür hemen hemen normaldir. Bu eğer bir seferde sadece bir satır getirme iyidir, ama tür normal küçük veri kümeleri için küçük ve belleğine sorguları için almak istiyorum, fazladan bellek kullanımı bir zerre önemli gitmiyor.

Her kullanıcı satırda kullanıcıların bir sürü ve birçok bilgi varsa SELECT * FROM user, ancak kesinlikle, bir unhelpfully büyük dataset oluşturmak olabilir. Sütunlar ve minimum aşağı seçilen satır sayısını tutmak için çalışın, bilgi aslında sayfaya koymak için gidiyoruz.