DEV Community

Phan Tâm Blog
Phan Tâm Blog

Posted on Originally published at phantam.top on

Tối Ưu Truy Vấn SQL & Connection Pool Tải Cao

Trong các hệ thống xử lý hàng triệu request mỗi ngày, cơ sở dữ liệu (Database) luôn là điểm nghẽn (bottleneck) phổ biến nhất. Tiếp nối bài viết trước về thiết kế cơ sở dữ liệu, hôm nay tôi sẽ chia sẻ những kỹ thuật chuyên sâu giúp bạn "vắt kiệt" hiệu năng của SQL và cấu hình Connection Pool chuẩn production.

1. Phân tích truy vấn SQL chuyên sâu với lệnh EXPLAIN

Đừng đoán mò tại sao câu lệnh SQL chạy chậm. Hãy thói quen sử dụng lệnh EXPLAIN (hoặc EXPLAIN ANALYZE trên MySQL 8.0+) để hiểu cách Database Engine lập kế hoạch thực thi (Execution Plan).

Các chỉ số quan trọng cần kiểm tra

  • type: Cho biết phương thức truy cập dữ liệu. Hãy cẩn thận khi thấy ALL (Full Table Scan). Mục tiêu là đạt mức ref, eq_ref hoặc const.
  • key: Index thực tế được sử dụng. Nếu nhận giá trị NULL, truy vấn của bạn đang bỏ sót Index.
  • rows: Số lượng dòng dự kiến phải quét. Số này càng nhỏ, truy vấn càng nhanh.
  • Extra: Cần tránh tuyệt đối các trạng thái như Using filesort hoặc Using temporary trên các bảng dữ liệu lớn.

Case Study: Loại bỏ "Using filesort" bằng Composite Index

Giả sử bạn có truy vấn lọc bài viết theo danh mục và sắp xếp theo thời gian:

SELECT id, title FROM posts WHERE category_id = 3 ORDER BY created_at DESC LIMIT 20;
Enter fullscreen mode Exit fullscreen mode

Nếu chỉ tạo Index riêng lẻ cho category_id, MySQL vẫn phải thực hiện thao tác sắp xếp lại dữ liệu trong bộ nhớ (filesort). Giải pháp tối ưu là tạo một Composite Index bao hàm cả điều kiện lọc và sắp xếp:

CREATE INDEX idx_category_created ON posts(category_id, created_at DESC);
Enter fullscreen mode Exit fullscreen mode

2. Xử lý Slow Query và Tối ưu bộ nhớ InnoDB Buffer Pool

Để phát hiện các truy vấn đang làm tụt hiệu năng toàn hệ thống, hãy kích hoạt bộ ghi nhật ký truy vấn chậm (Slow Query Log) trong file cấu hình my.cnf:

slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 1
log_queries_not_using_indexes = 1
Enter fullscreen mode Exit fullscreen mode

Tối ưu bộ nhớ đệm InnoDB Buffer Pool

InnoDB Buffer Pool là nơi lưu trữ dữ liệu đệm và các chỉ mục Index trong RAM. Đối với server dedicated chạy Database, bạn nên dành khoảng 70% - 80% RAM vật lý cho thông số này để hạn chế đĩa I/O.

innodb_buffer_pool_size = 12G
innodb_buffer_pool_instances = 8
Enter fullscreen mode Exit fullscreen mode

💡 Lưu ý quan trọng: Kiểm tra tỷ lệ Cache Hit Ratio bằng lệnh SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_read%';. Nếu tỷ lệ đọc từ RAM đạt > 99%, hệ thống của bạn đang vận hành rất tốt. Đừng quên tham khảo thêm bài viết tối ưu máy chủ Linux để tinh chỉnh Swap hợp lý.

3. Cấu hình Connection Pool cho ứng dụng chịu tải cao

Khởi tạo một kết nối cơ sở dữ liệu mới tốn rất nhiều tài nguyên (TCP Handshake, Authentication, RAM). Sử dụng Connection Pool (như HikariCP, Knex.js, PgBouncer) là giải pháp bắt buộc cho ứng dụng cao tải.

Công thức tính Pool Size tối ưu

Một sai lầm phổ biến của lập trình viên là thiết lập max_connections quá lớn. Theo nghiên cứu từ PostgreSQL và HikariCP, công thức tính Pool Size tối ưu được xác định như sau:

pool_size = (core_count * 2) + effective_spindle_count
Enter fullscreen mode Exit fullscreen mode

Ví dụ: Với máy chủ 4 CPU Cores và ổ cứng SSD (effective_spindle_count = 1), số lượng connection lý tưởng chỉ cần từ 9 đến 10 connections cho mỗi instance ứng dụng nhờ cơ chế Multiplexing.

Các tham số Timeout bắt buộc phải cấu hình

  • maxLifetime: Thời gian sống tối đa của một kết nối trong Pool (nên đặt ngắn hơn wait_timeout của MySQL vài phút).
  • idleTimeout: Thời gian một kết nối rảnh rỗi trước khi bị thu hồi.
  • connectionTimeout: Thời gian ứng dụng chờ lấy kết nối từ pool trước khi ném ra lỗi Timeout Exception (khuyến nghị: 3000ms - 5000ms).

Lời kết

Tối ưu cơ sở dữ liệu là một chuỗi quá trình quan sát, đo đạc và tinh chỉnh liên tục. Việc kết hợp giữa câu lệnh SQL chuẩn chỉnh, chiến lược đánh Index thông minh cùng việc cấu hình Connection Pool chuẩn xác sẽ giúp hệ thống của bạn vận hành êm ái dưới áp lực tải lớn.

Top comments (0)