Що швидше db_query, db_select або EntityFieldQuery


15

Тому я намагаюся дізнатися, що швидше db_query, db_select чи EntityFieldQuery. Наразі я використовую EntityFieldQuery. Я захоплюю близько 1600 записів на вузлах.

Я усвідомлюю, що це може бути оподаткуванням системи, тому я просто хочу розібратися, який найкращий варіант захопити 1600 вузлів. Гоління секунд чи навіть мілісекунд мало б важливе значення для програми, яку я будую.

Заздалегідь дякую за відповіді.


Ви це профілювали?
mpdonadio

Не впевнений, що ти маєш на увазі. Не могли б ви трохи допрацювати?
Хорхе Кальдерон

Що вам слід використовувати, залежить від того, що ви намагаєтеся робити саме? Якщо ви можете детальніше розповісти, ми можемо допомогти. Якщо у вас працює багато запитів, db_query () - найшвидший. Однак якщо ви завантажуєте об'єкти разом із ним (entit_load), це, мабуть, не має значення, оскільки завантаження суті буде повільним при завантаженні 1600+ сутностей.
donutdan4114

1
Це більше, ніж просто швидкість коду запиту / запиту. Наприклад, чи потрібен вам доступ до вузла?
рубін

@rooby - Так. Я продовжував використовувати EntityFieldQuery, але для своїх потреб я мав доступ до трьох спеціальних полів у вузлах. Однак відповідь нижче все ще є найкращою відповіддю, оскільки Раф дав кілька хороших порад та цифр. Який саме і шукав.
Хорхе Кальдерон

Відповіді:


24

Коротше, щоб відповісти на ваше запитання, db_query - найшвидший! Ось деякі причини, факти та цифри, зібрані з різних питань, джерел:

Простий гугл цього питання, і дають такі результати:

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

і це

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

Якщо ви помітили вище, db_select робить більше функціональних дзвінків та використовує більше пам'яті, ніж db_query.

  1. Дивіться тут причини, чому слід використовувати db_select
  2. Дивіться тут причини, чому слід використовувати EntityFieldQuery над db_select
  3. Дивіться тут для порівняння продуктивності db_query та db_select

Гадаю, вибір повинен базуватися виключно на ваших вимогах. EntityFieldQuery може бути повільнішим, але пропонує безліч переваг, таких як простий синтаксис, зберігання в полі підключається, нещільне з'єднання та багато іншого.


1
Це саме те, що я шукав. Дякую купу Раф.
Хорхе Кальдерон

1

Це дуже погана ідея, для 1600 вузлів не обходьте API та використовуйте EntityFieldQuery. Ви оптимізуєте неправильну річ.


Привіт Chx, ви могли б детальніше. Отже, підсумок, 1600 вузлів потрібно витягнути. Я вже використовую EntityFieldQuery, тому просто намагаюся зрозуміти, яка б погана ідея. Я знайшов, що EntityFieldQuery обмежує в деяких областях. Поки що це нічого не впливає на мене. У будь-якому разі, з нетерпінням чекаю Ваших думок.
Хорхе Кальдерон

1

Якщо ви просто хочете польові дані з усіх 1600 вузлів, EFQE може бути корисним. Якщо у вас вже є коефіцієнт EFQ, ви зможете зрозуміти, що вам потрібно, переглянувши сторінку пісочниці.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.