Drupal → Производительность EntityStorageInterface::load() vs EntityStorageInterface::loadMultiple()

07.07.2025

Дано — 10_000 нод с 10-ю текстовыми полями в каждой.

Код теста:

<?php

use Drupal\Component\Utility\Timer;
use Drupal\Core\Database\Database;

$node_storage = \Drupal::entityTypeManager()->getStorage('node');
$nodes_ids = $node_storage->getQuery()
  ->condition('type', 'article')
  ->sort('nid')
  ->range(0, 1000)
  ->accessCheck(FALSE)
  ->execute();

Database::startLog('test');
$query_count = count(\Drupal::database()->getLogger()->get('test'));
Timer::start('test');

if ($extra[0] == 'load') {
  foreach ($nodes_ids as $node_id) {
    $node_storage->load($node_id);
  }
}
if ($extra[0] == 'loadMultiple') {
  $node_storage->loadMultiple($nodes_ids);
}

$time = Timer::read('test');
$query_count = count(\Drupal::database()->getLogger()->get('test')) - $query_count;
echo <<<OUTPUT
  time: $time ms
  queries: $query_count
  OUTPUT;

Запуск через drush php:script snippets/test.php <test-type>.

Результаты:

Время выполнения Число SQL запросов
С пустой таблицей cache_entity
load() 5900 ms 15009
loadMultiple() 1000 ms 33
С прогретой таблицей cache_entity
load() 260 ms 1001
loadMultiple() 60 ms 2

Выводы — везде, где нужно загрузить несколько сущностей, надо использовать loadMultiple(), он гораздо эффективнее как по времени выполнения так и по числу sql запросов.

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

Добавить комментарий