Tối ưu câu lệnh truy vấn
- Chỉ SELECT những cột cần thiết: thay vì SELECT * thì chỉ SELECT các cột cần thiết để giảm lượng data truyền về, giảm chi phí CPU/mạng.
-
Dùng index đúng chỗ
- trên cột WHERE, JOIN, ORDER BY, GROUP BY
- đặt index cho các câu lệnh truy vấn nặng, lặp lại nhiều lần
- tránh đặt index cho cột thường xuyên thay đổi (cột thường thay đổi => đánh index bảng lại nhiều lần)
- index nhiều quá sẽ làm chậm INSERT, UPDATE, DELETE, vì phải đánh lại index bảng.
- Tránh dùng hàm lên cột được đánh index trong WHERE (trừ khi DB hỗ trợ function-based index): thay vì dùng YEAR(created_date) = 2024 thì ghi là created_date >= … and ….<= …. vì dùng hàm thì sẽ tính toán hàm trước ( sẽ quét toàn bộ bảng => mất hiệu lực của index)
- Dùng LIMIT để phân trang hoặc giới hạn kết quả
- Join đúng kiểu, đúng điều kiện
- Tránh subquery lồng quá sâu, dùng JOIN thay
- Dùng các bảng tạm / materialized view nếu truy vấn nặng
- Tránh OR trong WHERE dùng UNION ALL nếu được
- Luôn kiểm tra bằng EXPLAIN/ EXPLAIN ANALYST
- Dùng Catching nếu truy vấn lặp lại nhiều lần