К своему стыду только сегодня узнал об отличии 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
Похожие записи
- Программное изменение значения поля без вызова entity_save()
- Производительность EntityStorageInterface::load() vs EntityStorageInterface::loadMultiple()
- Добавить своё действие над сущностью в bulk operations
- Добавить своё действие над сущностью в contextual links
- Добавить своё действие над сущностью в operations links
Комментарии
Что Вы понимаете под "при прогретом кэше!"
когда поля есть в кэше
Посчитайте ещё с entitycache.
Добавить комментарий