Db_select'in db_query'den çok daha yavaş olması nedeniyle neden kullanmak isteyeyim?


Yanıtlar:


88

SelectQuery kullanmak için 5 neden vardır

  • Değişen sayıda koşul, birleşme, alan vb. İle dinamik sorgular oluşturuyorsunuz. Örnek için field_read_fields () 'ye bakınız .

  • Extender denilen kullanmak istiyorsunuz . Örnek genişleticiler PagerDefault (yerini almakta pager_query () ) ve TableSort (yerine tablesort_sql () ). Bunlar, SelectQuery'ye ek işlevler eklemenize izin verir. Ayrıca bkz. Özel bir tablodan veri içeren bir çağrı cihazıyla sıralanabilir masalar nasıl oluşturulur? . Bir örnek: node_page_default () .

  • Diğer modüllerin sorgularınızı değiştirmesine izin vermek istiyorsunuz. Ardından etiketler ekleyebilirsiniz ve SelectQuery otomatik olarak bu etiket için karşılık gelen bir değiştirme kancasını arayacaktır. Privatemsg modülümle buna çok güveniyorum (Zaten bunu D6'da özel bir sorgu oluşturucu ile yaptık).

  • Node_access sistemini sadece düğümleri göstermek için kullanmak / kullanmak istiyorsanız kullanıcının görmesine izin verilir. Sadece 'node_access' etiketini $ sorgunuza ekleyin. Bu db_rewrite_sql () yerine geçer.

  • SelectQuery, kodunuzun tüm desteklenen veritabanlarında aynı şekilde çalışmasına yardımcı olan birkaç özelliğe sahiptir. Örneğin, SelectQuery :: orderRandom () var . Ve eğer bir LIKE durumunuz varsa, -> condition ('field', $ value, 'LIKE') her zaman küçük / küçük harf duyarlı bir karşılaştırma olduğundan emin olacaktır. D6'da, çok daha yavaş olan için LOWER () kullanmak zorunda kaldı. Ancak AFAIK, şu anda bu ikisinden daha fazlası yok.

Bu nedenlerden hiçbiri belirli bir durum için geçerli değilse, db_query () kullanın.


1
Beşinci bir nokta, orderRandom () ve büyük / küçük harf duyarlı LIKE gibi veritabanı taşınabilirliği özellikleri eklendi.
Berdir

6
Altıncı neden olarak, çapraz veritabanı uyumluluğu eklerdim. Örneğin, Oracle sorguları, MySQL, Postgres vb. Yöntemlerden bazı şekillerde farklılık gösteren sözdizimine sahiptir. Bir db_select () öğesinden doğru sözdizimi oluşturmak için kod yazmak çok kolay olmayan bazı sorgu kodlarında olabileceğinden çok daha kolaydır. doğrudan db_query () içine boşaltılır.
BrianV

9

Hakkında belgelerdb_query() diyor ki:

SELECT sorguları için bu işlevi yalnızca basit bir sorgu dizesiyse kullanın. Arayan veya diğer modüllerin sorguyu değiştirmesi gerekiyorsa, bunun yerine db_select () kullanın.


Teşekkürler, ama bu oldukça spesifik değil. 'Basit sorgu dizesi' tanımını yorumlamaya oldukça açık bırakıyor. 6 birleşimi olan 4 tablodan birini seçiyorsam, bu hala basit bir sorgu mu, yoksa bunun yerine db_select () ile mi yapılmalı?
Chris Cohen

3
Bu "basit sorgu" ile ilgili değil, "basit bir sorgu dizesi " hakkında ve basit aslında sabit kodlanmış ve dinamik değil demektir. Daha fazla bilgi için cevabımı görün :)
Berdir

9

Her zaman db_select'i küçük performans kazanımlarına göre okunabilirliği, bakımı ve çapraz veritabanı uyumluluğunu tercih ettiğim için kullanıyorum. Ayrıca, belirtilen sayılarda verilen rakamların genel performans hakkında yanlış bir fikir verdiğini düşünüyorum. Bir sorguda 300 mikrosaniyelik bir farktan bahsediyoruz, tek bir sütundan daha fazlasını döndürürken genellikle milisaniyelik aralıkta çalışan. Ve sadece bir kerelik ek yükü (sınıf yükleme) bazı zamanlar olsa ve bu nedenle tam (sayfa) bir istek için farklılıklar çok daha az olsaydı şaşırmam.


Performans farkı çok basit değil; bkz db_query ve db_select performansı karşılaştırın . Berdir'in cevabında belirtilen özel özelliklerden birine ihtiyaç duymuyorsanız, db_select yerine db_query'yi öneririm.
geerlingguy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.