Метод explain
Метод explain применяется к запросу Eloquent
или Query Builder и возвращает информацию о том,
как база данных будет выполнять данный запрос.
Метод не принимает параметров и возвращает коллекцию
с планом выполнения, который содержит данные о
используемых индексах, типе соединения, количестве
проверяемых строк и других важных для оптимизации
показателях.
Синтаксис
<?php
$res = Model::explain();
?>
Пример
Давайте получим план выполнения простого запроса
для модели Article:
<?php
use AppModelsArticle;
$res = Article::where('status', 'active')->explain();
echo $res;
?>
Результат выполнения кода:
[
{
"id": 1,
"select_type": "SIMPLE",
"table": "articles",
"type": "ALL",
"possible_keys": null,
"key": null,
"key_len": null,
"ref": null,
"rows": 1500,
"Extra": "Using where"
}
]
Как видно из результата, запрос выполняет полное
сканирование таблицы (тип ALL), так как
не используется индекс. Поле rows показывает,
что будет проверено 1500 строк.
Пример
Теперь рассмотрим более сложный запрос с соединением таблиц:
<?php
use AppModelsArticle;
use IlluminateSupportFacadesDB;
$res = Article::join('categories', 'articles.category_id', '=', 'categories.id')
->where('articles.published', true)
->explain();
echo $res;
?>
Результат выполнения кода:
[
{
"id": 1,
"select_type": "SIMPLE",
"table": "categories",
"type": "ALL",
"possible_keys": "PRIMARY",
"key": null,
"key_len": null,
"ref": null,
"rows": 50,
"Extra": null
},
{
"id": 1,
"select_type": "SIMPLE",
"table": "articles",
"type": "ref",
"possible_keys": "articles_category_id_index",
"key": "articles_category_id_index",
"key_len": 8,
"ref": "categories.id",
"rows": 30,
"Extra": "Using where"
}
]
В этом примере видно, что для таблицы articles
используется индекс articles_category_id_index,
что значительно ускоряет выполнение запроса.
Тип ref указывает на эффективное использование
индекса для соединения.
Пример
Метод explain также полезен для анализа
запросов с агрегацией:
<?php
use AppModelsArticle;
$res = Article::select('category_id')
->where('views', '>', 1000)
->groupBy('category_id')
->having('count', '>', 5)
->explain();
echo $res;
?>
Результат выполнения кода:
[
{
"id": 1,
"select_type": "SIMPLE",
"table": "articles",
"type": "range",
"possible_keys": "articles_views_index",
"key": "articles_views_index",
"key_len": 8,
"ref": null,
"rows": 200,
"Extra": "Using where; Using temporary; Using filesort"
}
]
Обратите внимание на поле Extra, которое
содержит "Using temporary; Using filesort".
Это означает, что для выполнения запроса потребуется
создание временной таблицы и сортировка, что может
быть неэффективно при большом объёме данных.