Drupal → Производительность Entity Query vs Query Builder vs Sql query

13.06.2025

Код теста:

use Drupal\Component\Utility\Timer;

Timer::start('test1');
for ($i = 0; $i < 100; $i++) {
  $query = \Drupal::entityQuery('node')
    ->condition('type', 'page')
    ->condition('status', 1)
    ->condition('uid.entity.status', 1)
    ->condition('field_category', 1)
    ->condition('field_category.entity.status', 1)
    ->sort('nid')
    ->range(0, 1000)
    ->accessCheck(FALSE);
  $ids = $query->execute();
}
echo 'entity query: ' . Timer::read('test1') . " ms\n";

// ---

Timer::start('test2');
for ($i = 0; $i < 100; $i++) {
  $query = \Drupal::database()->select('node_field_data', 'n');
  $query->fields('n', ['nid']);
  $query->condition('n.type', 'page');
  $query->condition('n.status', '1');
  $query->innerJoin('users_field_data', 'u', 'u.uid = n.uid');
  $query->condition('u.status', 1);
  $query->innerJoin('node__field_category', 'nc', 'nc.entity_id = n.nid');
  $query->condition('nc.field_category_target_id', 1);
  $query->innerJoin('taxonomy_term_field_data', 't', 't.tid = nc.field_category_target_id');
  $query->condition('t.status', 1);
  $query->orderBy('n.nid');
  $query->range(0, 1000);
  $ids = $query->execute()->fetchCol();
}
echo 'query builder: ' . Timer::read('test2') . " ms\n";

// ---

Timer::start('test3');
for ($i = 0; $i < 100; $i++) {
  $query = \Drupal::database()->query("
    SELECT n.nid
    FROM node_field_data n
    INNER JOIN users_field_data u ON u.uid = n.uid
    INNER JOIN node__field_category nc ON nc.entity_id = n.nid
    INNER JOIN taxonomy_term_field_data t ON t.tid = nc.field_category_target_id
    WHERE
      n.type = :node_type AND
      n.status = :node_status AND
      u.status = :user_status AND
      nc.field_category_target_id = :category AND
      t.status = :term_status
    ORDER BY n.nid
    LIMIT 0, 1000
  ", [
    ':node_type' => 'page',
    ':node_status' => 1,
    ':user_status' => 1,
    ':category' => 1,
    ':term_status' => 1,
  ]);
  $ids = $query->fetchCol();
}
echo 'sql query: ' . Timer::read('test3') . " ms\n";

Тестируется именно билд запроса, а не скорость работы базы данных.

Результаты:

entity query:  112 ms
query builder: 30 ms
sql query:     18 ms

Тестовое окружение:
Drupal 11.1
PHP 8.3
MariaDB 11.2 (query cache = off)

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

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