К своему стыду только сегодня узнал об отличии 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
Комментарии
Что Вы понимаете под "при прогретом кэше!"
когда поля есть в кэше
Посчитайте ещё с entitycache.
Добавить комментарий