PHP: Hàm phát hiện query chậm

Website chậm không phải vì server yếu, mà rất thường là vì query SQL ngu ngơ chạy âm thầm. Một query chậm vài trăm ms, gọi vài trăm lần là đủ bóp chết server. Vấn đề là: phần lớn dev không hề biết query nào đang chậm. Bài này giải quyết đúng một việc: phát hiện query chậm ngay trong PHP, log lại để tối ưu.

PHP: Hàm phát hiện query chậm

Query chậm nguy hiểm hơn bạn nghĩ

  • Không gây lỗi, nên rất khó phát hiện
  • Chạy càng lâu, dữ liệu càng to, càng chậm
  • Chỉ cần một query chậm là đủ kéo sập cả page

Đợi tới khi site lag mới debug thì thường đã muộn.

Tư duy phát hiện query chậm đúng cách

  • Đo thời gian thực thi từng query
  • Đặt ngưỡng chậm rõ ràng
  • Log lại query vượt ngưỡng
  • Không làm ảnh hưởng flow chính

Ngưỡng query chậm nên là bao nhiêu

  • Local / dev: 50–100 ms
  • Production nhỏ: 100–200 ms
  • Hệ thống lớn: tuỳ tải, nhưng phải có ngưỡng

Hàm phát hiện query chậm với PDO

<?php
function execute_query_with_monitor(
    PDO $pdo,
    string $sql,
    array $params = [],
    float $slowThresholdMs = 100
): PDOStatement {
    $start = microtime(true);

    $stmt = $pdo->prepare($sql);
    $stmt->execute($params);

    $durationMs = (microtime(true) - $start) * 1000;

    if ($durationMs >= $slowThresholdMs) {
        log_slow_query($sql, $params, $durationMs);
    }

    return $stmt;
}

Hàm log query chậm

<?php
function log_slow_query(string $sql, array $params, float $durationMs): void {
    $log = [
        'time'     => date('Y-m-d H:i:s'),
        'duration' => round($durationMs, 2) . ' ms',
        'sql'      => $sql,
        'params'   => json_encode($params, JSON_UNESCAPED_UNICODE)
    ];

    $line = implode(' | ', $log) . PHP_EOL;

    file_put_contents(
        __DIR__ . '/slow-query.log',
        $line,
        FILE_APPEND | LOCK_EX
    );
}

Cách sử dụng trong code thực tế

<?php
$stmt = execute_query_with_monitor(
    $pdo,
    'SELECT * FROM users WHERE email = ?',
    [$email],
    120
);

$user = $stmt->fetch(PDO::FETCH_ASSOC);

Vì sao không nên log mọi query

  • Log quá nhiều làm chậm hệ thống
  • File log phình rất nhanh
  • Khó lọc ra vấn đề thật sự

Chỉ log query vượt ngưỡng mới có giá trị.

Nâng cấp nhẹ để debug sâu hơn

Có thể bổ sung thêm:

  • IP người dùng
  • URL hiện tại
  • Stack trace rút gọn

Nhưng đừng nhét quá nhiều vào production nếu chưa cần.

Những sai lầm thường gặp

  • Chỉ bật slow query log của MySQL, bỏ qua PHP
  • Không đo thời gian prepare + execute
  • Để ngưỡng quá cao rồi tự lừa mình

Khi nào hàm này phát huy sức mạnh nhất

  • Website bắt đầu có traffic
  • Query phức tạp, join nhiều bảng
  • Code cũ không ai dám đụng

Kết luận

Phát hiện query chậm không phải để đổ lỗi cho database, mà để biết chính xác mình đang ngu ở đâu. Chỉ cần một hàm đo thời gian và log đúng chỗ, bạn đã có trong tay bản đồ dẫn tới hiệu năng tốt hơn.

Backend mạnh không phải là backend chạy nhanh nhất, mà là backend biết mình đang chậm chỗ nào 😏

Bình luận


  • Không có bình luận.

Init Toolbox

Nhấn Ctrl + \ trên máy tính, hoặc vuốt sang trái ở bất kỳ đâu trên mobile.

Đăng nhập





Đang tải...