2. 18:14 12/08/2026
Chào bạn Linh Giang,
Không nên tạo index theo kiểu mỗi cột một index rồi hy vọng optimizer ghép lại đúng ý. Hãy bắt đầu từ truy vấn thực, tần suất chạy, cardinality, số hàng đọc và thứ tự cần trả về. Với mẫu lọc bằng tenant_id/status rồi sắp xếp theo created_at/id, một index ghép thường hiệu quả hơn các index rời khi nó phản ánh chính access pattern đó.
Quy trình nên là:
1. Lấy câu SQL thật với dữ liệu/parameter đại diện, không tối ưu từ ví dụ nhỏ trên máy local.
2. Dùng EXPLAIN ANALYZE để so sánh số hàng/cost ước tính với số hàng/timing thực tế; chú ý iterator có loops cao hoặc phải đọc quá nhiều hàng.
3. Xem WHERE, JOIN và ORDER BY như một tổng thể. Thứ tự các cột trong index phải phục vụ điều kiện lọc và thứ tự truy xuất thực tế, không chỉ tên cột xuất hiện trong câu SQL.
4. Thêm một index giả thuyết, đo lại latency, rows examined, write cost và dung lượng; sau đó xóa index trùng/chồng lấp nếu đã có bằng chứng.
5. Cập nhật statistics khi cần và kiểm tra các query khác dùng cùng bảng để tránh tối ưu một màn hình nhưng làm chậm write path.
EXPLAIN ANALYZE chạy câu SELECT thật, vì vậy cần dùng trên môi trường có kiểm soát và không chạy bừa câu lệnh tốn tài nguyên vào production. Mục tiêu là giảm lượng dữ liệu phải đọc, không phải chỉ làm cho cột key trong EXPLAIN khác NULL.
Tham khảo: MySQL 8.4 Reference Manual về EXPLAIN và Optimization/Indexes.
0