Ответ
Отладка SQL строится на анализе самого запроса и его плана выполнения:
-
Логирование запросов — в Laravel это делается через метод
->dd()у построителя запросов или глобально включением лога вconfig/database.php. В чистом PDO логирую запросы и параметры:$sql = "SELECT * FROM users WHERE email = :email"; $params = ['email' => $email]; // Логирую перед выполнением error_log("Executing SQL: $sql with " . json_encode($params)); $stmt = $pdo->prepare($sql); $stmt->execute($params); -
Анализ плана выполнения с
EXPLAIN— это первый шаг при работе с медленным запросом. Показывает, какие индексы используются, тип соединения и приблизительное количество обрабатываемых строк.EXPLAIN SELECT * FROM orders WHERE user_id = 123 AND status = 'completed'; -
Использование
SHOW PROCESSLIST— для выявления "висящих" или долгих запросов непосредственно на сервере БД. -
Инструменты администрирования БД — MySQL Workbench или Adminer для визуального анализа, построения диаграмм и профилирования.
-
Панели отладки фреймворков — Laravel Telescope или Clockwork дают детальную информацию о времени выполнения, количестве запросов и их "узких местах" прямо в браузере.
Ответ 18+ 🔞
Слушай, вот ты спрашиваешь про отладку SQL, а это, блядь, целое искусство, я тебе скажу. Не просто так запрос написал и поехал — надо же понимать, что эта железяка в итоге вытворяет. Иначе получишь запрос, который жрёт ресурсов овердохуища, а отдаёт нихуя. Так что лови, как это делают не совсем криворукие ребята.
Первое и самое простое — это логирование. В Laravel, например, красота — прилепил к запросу ->dd() и тут же видишь, что на самом деле улетело в базу, со всеми параметрами. В чистом PDO тоже не боги горшки обжигают — просто перед выполнением выплюни в лог и сам запрос, и все подставляемые значения. Главное — не забудь, а то будешь потом как дурак гадать, почему :email оказался пустым.
$sql = "SELECT * FROM users WHERE email = :email";
$params = ['email' => $email];
// Логирую перед выполнением
error_log("Executing SQL: $sql with " . json_encode($params));
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
Дальше, если запрос тормозит как черепаха в сиропе, первым делом EXPLAIN в ход. Это, ёпта, как рентген для твоего запроса. Покажет, какие индексы он юзает (или нихуя не юзает), сколько строк перелопатит и в каком порядке. Бывает, смотришь на план и просто сам от себя охуеваешь — оказывается, он делает полный перебор таблицы на миллион записей, чтобы найти одну.
EXPLAIN SELECT * FROM orders WHERE user_id = 123 AND status = 'completed';
Ещё одна хитрая жопа — SHOW PROCESSLIST. Запустишь эту команду на сервере БД и увидишь все текущие подключения. Тут можно выловить те самые «висящие» запросы, которые уже три часа выполняются и всех тормозят. Увидел такой — сразу понятно, кого пристрелить.
Ну и куда же без специальных штук. Для визуалов есть MySQL Workbench или тот же Adminer — там можно и план выполнения красивенько посмотреть, и диаграммы зависимостей построить. Очень помогает, когда у тебя в голове уже каша от JOIN'ов на пять таблиц.
А если ты работаешь в рамках какого-нибудь модного фреймворка, то панели отладки — это просто песня. Laravel Telescope или Clockwork прямо в браузере покажут: сколько запросов выполнилось, сколько времени каждый жрал, и даже подсветят, где, блядь, N+1 проблема вылезла. Удобно до безобразия — не надо никуда лазить, всё как на ладони.
В общем, суть в чём: не пускай запросы на самотёк. Сначала посмотри, что он делает (EXPLAIN), потом измерь, сколько он это делает (логи, профайлер), и только потом неси в продакшн. А то будет тебе хиросима в базе, и восстанавливать её — терпения ноль ебать.