📑 Mục lục bài viết
Cơ sở dữ liệu thường là điểm nghẽn (Bottleneck) lớn nhất của bất kỳ ứng dụng web nào khi chịu tải cao. Việc cấu hình sai bộ nhớ đệm hoặc thiếu Index thích hợp có thể khiến thời gian phản hồi của truy vấn tăng từ vài mili-giây lên đến hàng chục giây.
1. Nguyên tắc Đánh Index (Chỉ mục) Hiệu quả
Chỉ mục trong MySQL tương tự như mục lục của một cuốn sách. Nếu không có Index, MySQL buộc phải thực hiện Full Table Scan (quét từng dòng trong ổ cứng):
- Composite Index (Chỉ mục kết hợp): Tuân thủ quy tắc tiền tố bên trái (Leftmost Prefix Rule). Ví dụ: Index trên
(status, created_at)sẽ hỗ trợ tốt cho các truy vấn lọc trạng thái và sắp xếp theo ngày. - Tránh Over-Indexing: Mỗi Index tạo thêm chi phí ghi khi thực hiện lệnh
INSERT,UPDATE,DELETE. Hãy chỉ tạo Index cho các cột thường xuyên xuất hiện trong mệnh đềWHERE,JOINhoặcORDER BY.
2. Phân tích Truy vấn Chậm với EXPLAIN PLAN
Sử dụng lệnh EXPLAIN ANALYZE để kiểm tra chính xác cách MySQL thực thi câu truy vấn:
EXPLAIN ANALYZE
SELECT p.id, p.post_title, u.display_name
FROM wp_posts p
INNER JOIN wp_users u ON p.post_author = u.ID
WHERE p.post_status = 'publish'
AND p.post_type = 'post'
ORDER BY p.post_date DESC
LIMIT 10;
Các chỉ số cần đặc biệt lưu ý:
- type = ALL: Cảnh báo nguy hiểm – MySQL đang quét toàn bộ bảng dữ liệu.
- type = ref hoặc range: MySQL đang sử dụng Index để trỏ trực tiếp đến vùng dữ liệu cần thiết.
- Using filesort / Using temporary: Cần xem xét lại Index trên các cột của mệnh đề
ORDER BYvàGROUP BY.
3. Cấu hình Tham số InnoDB Buffer Pool trong my.ini / my.cnf
innodb_buffer_pool_size là tham số quan trọng nhất của MySQL. Đối với máy chủ cơ sở dữ liệu chuyên dụng, giá trị này nên được đặt ở mức 60% – 75% tổng dung lượng RAM vật lý:
[mysqld]
# Cấp phát 4GB RAM cho bộ đệm dữ liệu InnoDB
innodb_buffer_pool_size = 4G
innodb_buffer_pool_instances = 4
# Tối ưu hóa ghi log giao dịch
innodb_flush_log_at_trx_commit = 2
innodb_log_buffer_size = 64M
# Quản lý kết nối
max_connections = 300
connect_timeout = 10
wait_timeout = 60
Leave a Reply