xandeadx.ru Блог музицирующего веб-девелопера

Drupal → Производительность node_load() vs. node_load_multiple()

К своему стыду только сегодня узнал об отличии node_load() от node_load_multiple(). Раньше всегда думал, что node_load() это просто короткая запись reset(node_load_multiple(array($nid))), а внутри всё работает идентично, как оказалось это не совсем так.

node_load_multiple() загружает все ноды одним запросом, плюс ещё парой запросов загружает все метаданные — поля, статистика комментов, автора нод, и т.д.

node_load() же делает по запросу на каждую ноду, плюс столько же запросов на получение метаданных.

Итого при загрузке 100 нод имеем:

Время выполнения теста Число всех SQL запросов
с пустым cache_field
node_load() 560 ms 954
node_load_multiple() 230 ms 270
с прогретым cache_field
node_load() 160 ms 407
node_load_multiple() 15 ms 38

Разница в 10 раз при прогретом кэше!

Всё сказанное актуально и для других *_load()/*_load_multiple() функций.

Пойду делать ревизию своих модулей и тестов =)

Исходники тестов: node_load(), node_load_multiple().

Написанное актуально для Drupal 7
Похожие записи

Комментарии RSS

Что Вы понимаете под "при прогретом кэше!"

когда поля есть в кэше

Посчитайте ещё с entitycache.

Оставить комментарий

Содержимое этого поля является приватным и не будет отображаться публично. Если у вас есть аккаунт в Gravatar, привязанный к этому e-mail адресу, то он будет использован для отображения аватара.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Доступные HTML теги: <a> <i> <b> <strong> <code> <ul> <ol> <li> <blockquote> <em> <s>
  • Строки и параграфы переносятся автоматически.
  • Подсветка кода осуществляется с помощью тегов: <code>, <css>, <html>, <ini>, <javascript>, <sql>, <php>. Поддерживаемые стили выделения кода: <foo>, [foo].

Подробнее о форматировании