PHP - Sorgu tek bir yineleme başına bir değer veya başlangıcında tüm almak ve diziden almak?

3 Cevap php

Ben şöyle bir işlevi var:

//iteration over scales
foreach ($surveyScales as $scale)
{
    $surveyItems = $scale->findDependentRowset('SurveyItems');

    //nested iteration over items in scale
    foreach ($surveyItems as $item)
    {
        //retrieve a single value from a result table and do some stuff
        //depending on certain params from $item / $scale
    }
}

QUESTION: bu iç foreach içindeki her değeri için db sorgusu yapmak için iyidir ya da bir diziye tüm sonuç değerleri almak ve oradan değerini almak için daha iyidir?

3 Cevap

Veri düzine adet döndüren sorgu tek bir veri 1 parça dönmek 12 sorguları daha neredeyse 12x hızlıdır.

Oh, ve HİÇ bir döngü içinde bir SQL koymak ASLA, her zaman bir felaket yol açacaktır.

App, yeni bir bağlantı her sorgu için açılmış olabilir nasıl çalıştığını bağlı olarak, bu her DB sunucu bağlantılarının sayısının bir sınırı olduğu gibi özellikle kötü. Sonra da bu her kullanıcı için olur fark, yani 5 kullanıcılar ve sizinle birlikte 50 sorgular zaten herhangi bir anda 250 sorguları var. Tüm sorguları sadece 1 bağlantısını paylaşmak bile kullanıcıların bu sayfada sunucusunun DB hogging ve herkes paylaşmak için vardır, çünkü Ama, sen başka, her şey için her sayfa bu yavaşlama, daha DB sunucu X kez vergi ediyoruz.

Ben bütün bir uygulama sadece bunu yapmayın, çünkü bu 1 tasarım kusur geçmişte başarısız olduğunu gördüm.

Ben başkaları ile katılıyorum - ve ben kullanmakta olduğunuz Zend Framework tablo ilişkileri API tasarlanmış ve kodlanmış biriyim!

Eğer already üst satır için bir başvuru varsa, findDependentRowset() yararlıdır, ve might ile ilgili satırlarını gerekir. Bu işlev hem tablo birleştirme sorgu karşılaştırıldığında, en az verimli değildir. Performansı hiç bir öncelik eğer, hiç, bir döngü içinde findDependentRowset() dememeliyiz. Bunun yerine, hem bir tablo JOIN oluşan bir SQL sorgusu yazmak.

Onların Framework için zerdüştlerin hedefi ziyade performans, tasarım basitlik olduğunu geçmişe talihsiz.

Ben Zend çalışan devam etseydi, ben ilgili Zend_Db_Table nesnelere karşı katıldı sorguları gerçekleştirmek için uygun bir yol ile Tablo arayüzü geliştirmek için denedim. Ben projeyi ayrıldıktan sonra uygulanan çözüm Select nesnesi oluşturmak ve korkunç çirkin olan, fetchAll() onu geçmektir.

edit: Yorumlarınız cevap olarak, ben gereksinimleri bir dizi verilen bir çözüm oluşturmak için elimden geleni yaptım. Ben ne yaptığını gayet iyi hissediyorum. Ama Zend bir IDE araçları şirket, bu yüzden doğal olarak değer performanslarını runtime değil, kodlama kolaylık olduğunu. "Hızlı Uygulama Geliştirme" hızlı uygulamalar geliştirmek için anlamına gelebilir, ya hızla uygulamaları geliştirmek için. Bir araçları şirket için, ikincisi demektir.

Kesinlikle tüm almak ve diziden almak.