Whats lebih cepat db_query, db_select, atau EntityFieldQuery


15

Jadi saya mencoba mencari tahu apa yang lebih cepat db_query, db_select, atau EntityFieldQuery. Saat ini saya menggunakan EntityFieldQuery. Saya mengambil sekitar 1.600 entri simpul.

Saya menyadari ini bisa membebani sistem jadi saya hanya ingin mencari tahu yang merupakan pilihan terbaik untuk mengambil 1.600 node. Mencukur detik atau bahkan milidetik akan sangat berarti dengan aplikasi yang saya bangun.

Terima kasih sebelumnya atas jawaban Anda.


Sudahkah Anda membuat profil?
mpdonadio

Tidak yakin apa yang kamu maksud. Bisakah Anda menguraikan sedikit?
Jorge Calderon

Apa yang harus Anda gunakan tergantung pada apa yang Anda coba lakukan dengan tepat? Jika Anda dapat memberikan detail lebih lanjut, kami mungkin dapat membantu. Jika Anda menjalankan banyak kueri, db_query () adalah yang tercepat. Namun, jika Anda memuat entitas dengannya (entity_load) daripada itu mungkin tidak masalah, karena entity_load akan lambat saat memuat 1600+ entitas.
donutdan4114

1
Ada lebih dari sekadar kecepatan kode kueri / kueri. Misalnya apakah Anda memerlukan akses node?
rooby

@rooby - Ya saya lakukan. Saya terus menggunakan EntityFieldQuery tetapi untuk kebutuhan saya, saya harus memiliki akses ke tiga bidang khusus di node. Namun, jawaban di bawah ini masih merupakan jawaban terbaik karena raf memberikan beberapa saran dan angka yang cukup bagus. Yang persis seperti apa yang saya cari.
Jorge Calderon

Jawaban:


24

Untuk menjawab pertanyaan Anda secara singkat, db_query adalah yang tercepat! Berikut adalah beberapa alasan, fakta dan angka yang dihimpun dari berbagai pertanyaan, sumber:

Googling sederhana dari pertanyaan ini, dapatkan hasil berikut:

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()

dan ini

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

Jika Anda perhatikan di atas, db_select membuat lebih banyak panggilan fungsi dan menggunakan lebih banyak memori daripada db_query.

  1. Lihat di sini untuk alasan mengapa menggunakan db_select
  2. Lihat di sini untuk alasan mengapa menggunakan EntityFieldQuery di atas db_select
  3. Lihat di sini untuk perbandingan kinerja db_query dan db_select

Saya kira pilihannya harus semata-mata didasarkan pada kebutuhan Anda. EntityFieldQuery mungkin lebih lambat tetapi, menawarkan banyak keuntungan seperti sintaksis sederhana, penyimpanan bidang bersifat pluggable, kopling longgar dan banyak lagi.


1
Inilah yang saya cari. Terima kasih banyak, Raf.
Jorge Calderon

1

Itu ide yang sangat buruk di sana, untuk 1600 node, jangan berkeliling API dan menggunakan EntityFieldQuery. Anda mengoptimalkan hal yang salah.


Hai Chx, bisakah Anda menguraikan. Jadi intinya, 1600 node perlu ditarik. Saya sudah menggunakan EntityFieldQuery jadi hanya mencoba memahami apa ide buruk itu. Apa yang saya temukan adalah bahwa EntityFieldQuery membatasi di beberapa area. Sejauh ini tidak ada yang mempengaruhi saya. Ngomong-ngomong, nantikan mendengar pikiran Anda.
Jorge Calderon

1

Jika Anda hanya ingin data lapangan dari semua 1600 node, EFQE mungkin bisa membantu. Jika Anda sudah memiliki EFQ Anda harus dapat mengetahui apa yang Anda butuhkan dengan melihat halaman kotak pasir.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.