Код теста:
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
Похожие записи
- Производительность EntityStorageInterface::load() vs EntityStorageInterface::loadMultiple()
- Отличие методов BaseFieldDefinition::setDefaultValue() и BaseFieldDefinition::setInitialValue()
- Производительность Drupal::token()->replace() vs strtr() vs inline_template
- Как работает опция "Aggregation type" в настройках полей Views при включённой агрегации
- Тест оверхеда Layout Builder и Paragraphs
Добавить комментарий