PHP ve MySQL ile performans

4 Cevap php

I'm developing a site ve I have some doubts about the best approach to query the database. In general, when I load a page, several data has to be fetched from the database. I'm not sure if I'm doing it the best way. So right now ve as an example I call the following functions when the page is rendered:

(...)
(a) -> getAuthorName()         // 1 db connection - 1 db query
(b) -> getAuthorLocation()     // 1 db connection - 1 db query
(consider that here it could come more info the author....)

(...)
(c) count<- countNumberBooks() // 1 db connection - 1 db query
(d) if(count == 0)
(e)//do something
else
(f) books<- getBooksByAuthor() // 1 db connection - 1 db query
(g) renderBooks...

Bu örnek göz önüne alındığında, benim sorular şunlardır:

  1. Bu veritabanına sadece 1 sorgu sahip olmak için tek fonksiyonu (a) yapmak ve (b) için daha iyi mi?
  2. O (f), sonucu saymak ve sonra da mutlaka (e) veya (g), ve bu şekilde (c) kurtulmak yapmak için daha iyi mi?
  3. Ya da, uzaklaştırmak tek adımda veritabanından biz gereken her şeyi yüklemek yapının bir çeşit veri alıp, ve sonra sayfayı oluşturmak olarak okumak daha iyidir?

Teşekkürler!

4 Cevap

Bazı hızlı yanıtlar:

1) Evet o zaman olabilir bir satırdan itibaren mümkün olduğunca çok veri almak için daha iyi, ve o kadar bölünmüş değil.

2) bu her zaman getirme verileri kullanmak için gidiyoruz eğer, o zaman onu almak, ve php sayımı yapmak için daha iyi, biraz daha fazla bağlıdır.

3) Bu soruya genel bir cevap olması için karmaşık biraz, sen ORM çeşit bakmak isteyebilirsiniz.

Bu sunucu hakkında her türlü etmene, veritabanı şema vs vs bağlı olacak gibi, test etmek ve ölçmek gerekir

Ultra ultra meşgul bir siteye yayınlıyoruz sürece Ancak, gerçek cevap bu sadece önemli değil mi. Korumak daha kolay hangisi çözüm yapmak ve performans siteniz ile ilgili bir sorun olarak görmek için başlarsanız, sorunun ne olduğunu öğrenmek için profili.

Bu tamamen sizin sorunuza cevap, ama yine de yararlı olmayabilir: Ben bir "SELECT * id = $ author_id FROM authors" yapıyor tercih ve bir nesne (mysql_fetch_object (..)) gibi sonucunu almak istiyorum. Eğer yeni bir SQL sorgusu her zaman yapmadan ihtiyacınız olabilecek herhangi bir yazar verilere bakın Bu şekilde:

$sql = "SELECT * FROM authors WHERE id = $author_id";
$sth = mysql_query($sql);
if ($author_obj = mysql_fetch_object($sth)) {
  echo "Author name: " . $author_obj->name;
}

vs ..

Genel olarak az sorguları veritabanından daha fazla bilgi almak için performans için daha iyi. Ancak bu bazı durumlarda kod yeniden ve bakımı yenilgiler, böylece bir trade-off yapmak gerekecek.

Ayrıca sadece bir Sorguyu kaydetmek için tamamen farklı tablolardan ilgisiz bilgi UNIONing gibi antipatterns kullanmayın. Yani uzun vadede kimse yardımcı olur.

Ne kesinlikle yapmaması gereken sorguları bir döngü olması. Veritabanı düşük gecikme süresi vardır ve sayfaları çok sık vurmak değildir, özellikle eğer Ama sadece kolay bir kerelik sorgu oldukça çok (belki 100) veren, tüm bu kötü değil.

Bir veritabanına bağlanmak (özellikle, başka gidiş gerektirir) oldukça ucuz, ama değil gibi sorunu yapmanız tüm sorgular, muhtemelen, aynı bağlantı kullanmanız gerekir