Загрузка значения поля ноды при наличии только nid разными способами и сравнение скорости их выполнения

11.02 17:02

Достаточно часто возникает задача получить значение одного поля ноды при наличии только nid без целого объекта ноды. Допустим. у нас уже есть идентификатор ноды, которая нас интересует: $nid = $some_value;

Загрузку значения необходимого поля можно осуществить тремя разными способами:

1. Прямой запрос в базу данных. Это быстрый способ получить нужное значение напрямую с SQL:

2. Загрузить целый объект ноды и получить с него значения. Данный метод самый популярный и самый простой, но только в том случае, когда в ноде немного полей:

3. Загрузить значения поля с помощью функции field_get_items() :

Все три варианта простые, не занимают много времени при написании, но выполняются совсем по-разному и отличаются по времени выполнения. Если у вас простой небольшой сайт с низкими нагрузками, то node_load() кажется самым легким вариантом. Но при увеличении нагрузок стоит задуматься о перфомансном методе и нагрузке на сервер.

Проверим выполнение данных методов на нескольких разных проектах.

Все тестовые проекты лежат на одном хостинге на SSD дисках:

  • Небольшой проект. Получаем текстовое поле, нода включает 7 текстовых полей и 2 node_reference, количество нод ~ 600;

Время выполнения можно проверить при помощи php функции microtime().

Результаты:

TYPE

MESSAGE

exec_time_field_load

0.00136303901672

exec_time_node_load

1.50203704834E-5

exec_time_sql_query

0.000192880630493

Как видим, когда мы имеем простые ноды и их небольшое количество – быстрее всего выполняется node_load, причем получение результата через field_get_items() дало самый худший результат.

  • Інтернет каталог товаров с возможностью заказа товаров. Получаем текстовое поле, товар состоит с 20 полей, 2 term_refernce, 2 field_collection, количество нод ~ 6000;

Результаты:

TYPE

MESSAGE

exec_time_field_load

0.0032691955566406

exec_time_node_load

0.0067908763885498

exec_time_sql_query

0.00057196617126465

Результаты кардинально отличаются – при увеличении размера объекта ноды функция node_load() выполняется в разы дольше. Не намного лучше выполняется загрузка через поле. Но, как и в первом варианте, прямой запрос в базу остался с приблизительно тем же временем выполнения и показал самый лучший результат.

  • Большой онлайн-магазин на commerce. Получаем текстове поле,  более 400 активных модулей, варианты товаров, количество нод ~ 14000;

Результаты:

TYPE

MESSAGE

exec_time_field_load

0.0061240196228

exec_time_node_load

0.000473022460938

exec_time_sql_query

0.000407934188843

Поскольку в commerce в поле product_reference как Inlineentityform - Multiplevalues, это не очень нагружает функцию node_load(). Однако, все равно прямой запрос в базу данных за значением поля выполняется быстрее всего.

Итоги

Таким образом, можно смело утверждать, что для получения значения одного поля с ноды при наличии только ее идентификатора, из рассмотренных выше методов, самым лучшим является прямой запрос в базу данных.

Автор статьи: 
Сделать заказ сайта
 
Мы ответим на Ваш запрос в течение 24 часов! Гарантировано!

Support

Смело обращайтесь к нам со своими вопросами.

Награды & Сертификаты

  • Награда и сертификат - Microsoft gold certified partner
  • Награда и сертификат - Drupal Association Organization member
  • Награда и сертификат - Global Outcoursing 100
  • Награда и сертификат - Global services 100
  • Награда и сертификат - 500
  • Награда и сертификат - Service SAP Partner