Ne daha hızlı db_query, db_select veya EntityFieldQuery


15

Bu yüzden daha hızlı db_query, db_select veya EntityFieldQuery ne olduğunu bulmaya çalışıyorum. Şu anda EntityFieldQuery kullanıyorum. Yaklaşık 1600 düğüm girdisi alıyorum.

Bunun sistem üzerinden vergilendirilebileceğini anlıyorum, bu yüzden 1600 düğüm almak için en iyi seçeneğin hangisi olduğunu bulmak istiyorum. Oluşturduğum uygulama ile saniye veya milisaniyede tıraş olmak çok önemli olacaktır.

Cevaplarınız için şimdiden teşekkürler.


Profil verdiniz mi?
mpdonadio

Ne demek istediğinden emin değilim. Biraz ayrıntı verebilir misiniz?
Jorge Calderon

Ne kullanmalısınız tam olarak ne yapmaya çalıştığınıza bağlıdır? Daha fazla ayrıntı verebilirseniz size yardımcı olabiliriz. Çok fazla sorgu çalıştırıyorsanız, en hızlı db_query () yöntemidir. Bununla birlikte, onlarla varlık yüklüyorsanız (entity_load) muhtemelen önemli değildir, çünkü 1600+ varlık yüklenirken varlık_yüklemesi yavaş olacaktır.
donutdan4114

1
Sorgu kodu / sorgusunun hızından daha fazlası vardır. Örneğin, düğüm erişimine ihtiyacınız var mı?
rooby

@rooby - Evet, biliyorum. EntityFieldQuery kullanarak tuttu ama benim ihtiyaçları için, düğümlerde üç özel alanlara erişim olması gerekir. Ancak, aşağıdaki cevap hala en iyi cevaptır çünkü raf bazı iyi tavsiyeler ve sayılar verdi. Tam da aradığım şey buydu.
Jorge Calderon

Yanıtlar:


24

Sorunuzu kısaca cevaplamak için, db_query en hızlısıdır! Farklı sorulardan, kaynaklardan derlenen bazı nedenler, gerçekler ve rakamlar:

Bu sorunun basit bir Google arama, aşağıdaki sonuçları ile gelir:

For simple queries, db_query() is 22% faster than db_select()
For simple queries, db_query() is 124% faster than EFQ
For queries with two joins, db_query() is 29% faster than db_select()

ve bu

db_query():

Total Incl. Wall Time (microsec):   796 microsecs
Total Incl. CPU (microsecs):    0 microsecs
Total Incl. MemUse (bytes): 123,352 bytes
Total Incl. PeakMemUse (bytes): 124,248 bytes
Number of Function Calls:   38

db_select()

Total Incl. Wall Time (microsec):   1,118 microsecs
Total Incl. CPU (microsecs):    0 microsecs
Total Incl. MemUse (bytes): 425,216 bytes
Total Incl. PeakMemUse (bytes): 436,392 bytes
Number of Function Calls:   88

Yukarıda fark ederseniz, db_select daha fazla işlev çağrısı yapar ve db_query'den daha fazla bellek kullanır.

  1. Db_select kullanımının nedenleri için buraya bakın
  2. EntityFieldQuery'nin db_select üzerinden kullanılmasının nedenleri için buraya bakın
  3. Db_query ve db_select performans karşılaştırması için buraya bakın

Seçim sadece gereksinimlerinize dayanmalıdır sanırım. EntityFieldQuery daha yavaş olabilir, ancak basit sözdizimi, alan depolaması takılabilir, gevşek bağlantı ve çok daha fazlası gibi birçok avantaj sunar.


1
Tam da aradığım şey buydu. Çok teşekkürler Raf.
Jorge Calderon

1

Bu çok kötü bir fikir, 1600 düğüm için, API'leri dolaşmayın ve EntityFieldQuery kullanmayın. Yanlış şeyi optimize ediyorsunuz.


Selam Chx, biraz açar mısın? Bu nedenle, alt satırda, 1600 düğümün çekilmesi gerekiyor. Zaten EntityFieldQuery sadece kötü fikir ne olacağını anlamaya çalışıyorum kullanıyorum. Ne buldum EntityFieldQuery bazı alanlarda sınırlıyor olmasıdır. Şimdiye kadar beni etkileyen hiçbir şey yok. Her neyse, düşüncelerinizi duymayı dört gözle bekliyorum.
Jorge Calderon

1

Sadece 1600 düğümden alan verilerini istiyorsanız, EFQE size yardımcı olabilir. Zaten EFQ'nuz varsa, korumalı alan sayfasına bakarak neye ihtiyacınız olduğunu anlamanız gerekir.

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.