Quay lại blog
Tháng Một 27, 2026Hướng dẫn

Cách Tối Ưu Hóa Hiệu Suất MySQL

Hướng dẫn đầy đủ để tối ưu hóa hiệu suất cơ sở dữ liệu MySQL: điều chỉnh cấu hình, tối ưu hóa truy vấn, lập chỉ mục và giám sát.

Cách Tối Ưu Hóa Hiệu Suất MySQL

Tối ưu hóa hiệu suất MySQL rất quan trọng đối với các ứng dụng xử lý lượng dữ liệu lớn hoặc lưu lượng truy cập cao. Hướng dẫn này bao gồm các kỹ thuật cần thiết để cải thiện hiệu suất MySQL, từ điều chỉnh cấu hình đến tối ưu hóa truy vấn.

Tối Ưu Hóa Cấu Hình MySQL

Chỉnh sửa tệp cấu hình MySQL để tối ưu hóa hiệu suất dựa trên tài nguyên máy chủ của bạn:

bash
# Chỉnh sửa cấu hình MySQL (Ubuntu/Debian)
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

# Chỉnh sửa cấu hình MySQL (CentOS/RHEL)
sudo nano /etc/my.cnf

# Thêm hoặc sửa đổi các cài đặt này:
[mysqld]
innodb_buffer_pool_size = 1G
innodb_log_file_size = 256M
max_connections = 200
query_cache_size = 64M
query_cache_type = 1
tmp_table_size = 64M
max_heap_table_size = 64M

# Khởi động lại MySQL
sudo systemctl restart mysql  # Ubuntu/Debian
sudo systemctl restart mysqld   # CentOS/RHEL

Tối Ưu Hóa InnoDB

InnoDB là công cụ lưu trữ mặc định của MySQL. Tối ưu hóa nó để có hiệu suất tốt hơn:

bash
# Trong /etc/mysql/mysql.conf.d/mysqld.cnf hoặc /etc/my.cnf
[mysqld]
# InnoDB buffer pool (sử dụng 70-80% RAM có sẵn)
innodb_buffer_pool_size = 2G

# Kích thước tệp nhật ký InnoDB
innodb_log_file_size = 512M

# Phương thức flush InnoDB (cho SSD)
innodb_flush_method = O_DIRECT

# Luồng I/O InnoDB
innodb_read_io_threads = 4
innodb_write_io_threads = 4

# Flush nhật ký InnoDB tại commit giao dịch
innodb_flush_log_at_trx_commit = 2

Cấu Hình Query Cache

Query cache có thể cải thiện hiệu suất cho khối lượng công việc đọc nhiều (Lưu ý: Query cache đã bị loại bỏ trong MySQL 8.0):

bash
# Đối với MySQL 5.7 và trước đó
[mysqld]
query_cache_type = 1
query_cache_size = 128M
query_cache_limit = 2M

# Kiểm tra trạng thái query cache
mysql> SHOW VARIABLES LIKE 'query_cache%';

# Kiểm tra thống kê query cache
mysql> SHOW STATUS LIKE 'Qcache%';

Tối Ưu Hóa Chỉ Mục

Lập chỉ mục đúng cách rất quan trọng đối với hiệu suất truy vấn:

bash
# Phân tích bảng để cập nhật thống kê chỉ mục
ANALYZE TABLE table_name;

# Kiểm tra các chỉ mục không sử dụng
SELECT * FROM sys.schema_unused_indexes;

# Tạo chỉ mục
CREATE INDEX idx_column ON table_name(column_name);

# Tạo chỉ mục tổng hợp
CREATE INDEX idx_multi ON table_name(col1, col2, col3);

# Hiển thị chỉ mục
SHOW INDEXES FROM table_name;

# Xóa chỉ mục không sử dụng
DROP INDEX idx_name ON table_name;

Tối Ưu Hóa Truy Vấn

Tối ưu hóa các truy vấn SQL của bạn để có hiệu suất tốt hơn:

  • Sử dụng EXPLAIN để phân tích kế hoạch thực thi truy vấn: EXPLAIN SELECT * FROM table WHERE column = 'value'
  • Tránh SELECT * - chỉ chọn các cột cần thiết
  • Sử dụng LIMIT để giới hạn tập kết quả
  • Sử dụng mệnh đề WHERE phù hợp với các cột được lập chỉ mục
  • Tránh các hàm trong mệnh đề WHERE (ví dụ: WHERE YEAR(date) = 2026 → WHERE date >= '2026-01-01')
  • Sử dụng JOIN thay vì truy vấn con khi có thể
  • Sử dụng UNION thay vì OR cho nhiều điều kiện khi phù hợp

Giám Sát Hiệu Suất MySQL

bash
# Kiểm tra trạng thái MySQL
mysql> SHOW STATUS;

# Kiểm tra truy vấn chậm
mysql> SHOW VARIABLES LIKE 'slow_query%';

# Kích hoạt nhật ký truy vấn chậm
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2;

# Kiểm tra danh sách quy trình
mysql> SHOW PROCESSLIST;

# Kiểm tra trạng thái bảng
mysql> SHOW TABLE STATUS LIKE 'table_name';

# Kiểm tra trạng thái InnoDB
mysql> SHOW ENGINE INNODB STATUS;

Mẹo Tối Ưu Hóa Hiệu Suất

  • Chạy OPTIMIZE TABLE thường xuyên để chống phân mảnh bảng
  • Giám sát nhật ký truy vấn chậm và tối ưu hóa các truy vấn chậm
  • Sử dụng connection pooling để giảm overhead kết nối
  • Phân vùng các bảng lớn theo ngày hoặc phạm vi để có hiệu suất tốt hơn
  • Sử dụng bản sao đọc cho khối lượng công việc đọc nhiều
  • Giữ MySQL được cập nhật lên phiên bản ổn định mới nhất
  • Giám sát I/O đĩa và cân nhắc sử dụng lưu trữ SSD/NVMe
  • Sử dụng EXPLAIN ANALYZE (MySQL 8.0+) để phân tích truy vấn chi tiết