Какие инструменты и методы ты используешь для отладки SQL-запросов?

Ответ

Отладка SQL строится на анализе самого запроса и его плана выполнения:

  1. Логирование запросов — в 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);
  2. Анализ плана выполнения с EXPLAIN — это первый шаг при работе с медленным запросом. Показывает, какие индексы используются, тип соединения и приблизительное количество обрабатываемых строк.

    EXPLAIN SELECT * FROM orders WHERE user_id = 123 AND status = 'completed';
  3. Использование SHOW PROCESSLIST — для выявления "висящих" или долгих запросов непосредственно на сервере БД.

  4. Инструменты администрирования БДMySQL Workbench или Adminer для визуального анализа, построения диаграмм и профилирования.

  5. Панели отладки фреймворков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), потом измерь, сколько он это делает (логи, профайлер), и только потом неси в продакшн. А то будет тебе хиросима в базе, и восстанавливать её — терпения ноль ебать.