php ve MySQL: 2 istekleri ya da 1 istek?

9 Cevap php

Benim veritabanı olarak MySQL kullanarak php bir wepage inşa ediyorum.

Hangi yol daha hızlı?

  1. Folling sorgu ile MySQL 2 istekleri.

    SELECT points FROM data;
    SELECT sum(points) FROM data;

  2. MySQL 1 isteği. Geçici bir dizideki sonucu tutun ve php toplamı calcuale.

    $ Data = veri SELECT noktaları;

EDIT - Veri yaklaşık 200-500 satır olduğunu

9 Cevap

Gerçekten farklı faktörlerin çok bağlıdır oluyor. Her iki yöntem de çalışıyor ve daha hızlı hangisinin görmesini tavsiye ederim.

Phill ve Kibbee oldukça etkili bu cevap beri, ben erken optimizasyon kötü bir şey (TM) olduğuna işaret etmek istiyorum. Size ve profil, profil, profil için basit olanı yaz.

Ne kadar veri bahsediyoruz? MySQL vakaların çoğunda operasyonların bu tür yapıyor muhtemelen daha hızlı olduğunu söyleyebilirim.

Edit: Bahsettiğin veri tür, muhtemelen fark kitleleri yapmayacağız. Ama veritabanları PHP değildir oysa, sorguları bu tür için optimize olma eğilimindedir. Ben ikinci DB sorgu muhtemelen buna değer olduğunu düşünüyorum.

Tek satırda yapmak istiyorsanız, böyle bir çalışan toplam kullanabilirsiniz:

SET @total=0;
SELECT points, @total:=@total+points AS RunningTotal FROM data;

Ben performansı ile bir sorunu vardı dek bunu dert olmaz.

Eğer iki ayrı sorgu ile giderseniz, satır alma ve arasındaki veri değişen olasılığı için dikkat gerekiyor onların toplamını alıyorum. Gözlemlenebilir bir performans sorunu var dek, ben tutarlı sayfasını tutmak için kendi toplamını yapmaya devam ederdim.

MySQL ile verimlilik için başparmak genel kural SQL isteklerinin sayısını en aza indirmek için çalışmaktır. Veritabanına her çağrı havai ekler ve gerekli zaman açısından "pahalı" olduğunu.

MySQL tarafından yapılan optimizasyon oldukça iyidir. Birçok yerleştirmelerin ve hesaplamalar katılır ile çok karmaşık istekleri almak, ve verimli bir şekilde çalışmasını sağlayabilirsiniz.

Ama bu sadece bireysel istekleri optimize edebilirsiniz. İki farklı SQL tabloları arasındaki ilişkiyi kontrol ve aralarında optimize olamaz.

Sizin örnekte 1, iki ifadeleri veritabanına iki isteklerini yapmak ve masa kez taranır.

Eğer sonucu kaydetmek ve kendinizi 1 daha hızlı olurdu toplamını hesaplamak Sizin örnek 2. Bu yalnızca bir veritabanı çağrı olarak, ve bir miktar almak için PHP veri döngü veritabanına ikinci bir çağrı daha hızlıdır olacaktır.

Bunun sadece eğlence için.

SELECT COUNT(points) FROM `data`
UNION
SELECT points FROM `data`

Ilk satır toplam olacak, sonraki satırlar veri olacaktır.

NOTE: Union can be slow, but its an option.

Ayrıca daha eğlenceli yapmak ve bu satırları sıralama destekler olabilir.

SELECT 'total' AS name, COUNT(points) FROM `data`
UNION
SELECT 'points' AS name, points FROM `data`

Sonra PHP ile seçilmesi

while($row = mysql_fetch_assoc($query))
{
    if($row["data"] == "points")
    {
        echo $row["points"];
    }

    if($row["data"] == "total")
    {
        echo "Total is: ".$row["points"];
    }
}

Böyle sendika kullanabilirsiniz:

(Verilerinden toplam null seçeneğini puan) sendika (null, sum (puan) veri grubundan puan seçin);

The result will look something like this:

  point                total
   2                    null
   5                    null
   ...
   null                  7
you can figure out how to handle it.