# MySQL Performance Tuning: 10 Tips to Speed Up Your Database Queries
Khi ứng dụng web của bạn bắt đầu chậm lại, nguyên nhân thường đến từ cách cơ sở dữ liệu xử lý các truy vấn. MySQL là một trong những hệ quản trị cơ sở dữ liệu phổ biến nhất, nhưng nếu không được tối ưu đúng cách, nó có thể trở thành “nút thắt cổ chai” làm giảm trải nghiệm người dùng. Bài viết này sẽ chia sẻ 10 mẹo thực tế để cải thiện hiệu năng truy vấn MySQL, giúp ứng dụng của bạn chạy nhanh hơn và mượt hơn.
1. Phân tích truy vấn với EXPLAIN
Trước khi tối ưu, bạn cần hiểu MySQL đang thực thi truy vấn như thế nào. Lệnh EXPLAIN giúp bạn xem kế hoạch thực thi của truy vấn, từ đó phát hiện các vấn đề như quét toàn bộ bảng (full table scan) hay sử dụng index không hiệu quả.
Ví dụ:
EXPLAIN SELECT * FROM users WHERE email = '[email protected]';Kết quả sẽ cho biết MySQL có dùng index hay không, số hàng được quét, và cách nó join các bảng. Dựa vào đó, bạn có thể điều chỉnh truy vấn hoặc bổ sung index phù hợp.
2. Sử dụng Index một cách thông minh
Index giúp MySQL tìm dữ liệu nhanh hơn, nhưng không phải lúc nào cũng nên tạo index cho mọi cột. Chỉ nên index những cột thường xuyên được dùng trong WHERE, JOIN, hoặc ORDER BY.
Lưu ý:
– Tránh index những cột có ít giá trị phân biệt (low cardinality).
– Kết hợp nhiều cột trong một composite index nếu truy vấn thường filter theo nhiều điều kiện.
– Định kỳ kiểm tra và gỡ bỏ những index không còn được dùng để tiết kiệm không gian và tốc độ ghi.
3. Tối ưu cấu trúc bảng và kiểu dữ liệu
Sử dụng đúng kiểu dữ liệu giúp giảm kích thước bảng và tăng tốc độ truy vấn. Ví dụ:
– Dùng TINYINT thay vì INT nếu giá trị chỉ cần lưu trong khoảng nhỏ.
– Chọn VARCHAR thay vì TEXT khi chuỗi ngắn.
– Tránh NULL nếu không cần thiết, vì nó làm chậm index và tăng độ phức tạp.
Ngoài ra, chuẩn hóa dữ liệu (normalization) giúp tránh redundancy, nhưng đôi khi denormalization có thể cải thiện performance nếu truy vấn phức tạp.
4. Tận dụng Query Cache (nếu phiên bản hỗ trợ)
MySQL có cơ chế query cache, lưu kết quả của các truy vấn giống nhau để trả về nhanh chóng. Tuy nhiên, từ MySQL 8.0, tính năng này đã bị loại bỏ. Nếu bạn vẫn dùng phiên bản cũ, hãy cân nhắc kích hoạt:
SET GLOBAL query_cache_type = 1;
SET GLOBAL query_cache_size = 268435456; -- 256MB