- Query chậm nguy hiểm hơn bạn nghĩ
- Tư duy phát hiện query chậm đúng cách
- Ngưỡng query chậm nên là bao nhiêu
- Hàm phát hiện query chậm với PDO
- Hàm log query chậm
- Cách sử dụng trong code thực tế
- Vì sao không nên log mọi query
- Nâng cấp nhẹ để debug sâu hơn
- Những sai lầm thường gặp
- Khi nào hàm này phát huy sức mạnh nhất
- Kết luận
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