Việc MySQL CPU nhảy lên 20–30% (hoặc cao hơn) thường xảy ra khi Buffer Pool không còn gánh nổi hết và MySQL phải làm nhiều việc tốn tài nguyên.
Mình tóm theo tình huống:
🔥 1. Buffer Pool cache không đủ → phải đọc/ghi nhiều trên disk
- Nếu
innodb_buffer_pool_size
nhỏ so với dữ liệu (ví dụ data vài chục GB nhưng buffer chỉ vài GB).
- Dữ liệu ít dùng bị đẩy ra liên tục → truy vấn phải đọc lại từ disk → disk I/O nhiều → CPU phải lo xử lý.
🔥 2. Query phức tạp, index không tối ưu
- SELECT JOIN nhiều bảng, ORDER BY, GROUP BY nặng → MySQL phải đọc nhiều page, sort, build temporary tables.
- Nếu không có index tốt → MySQL phải scan nhiều page từ Buffer Pool và cả từ disk → CPU tăng mạnh.
🔥 3. Quá nhiều truy vấn đồng thời
- Nhiều connection chạy query cùng lúc → tranh chấp tài nguyên Buffer Pool → InnoDB phải lock & unlock liên tục.
- Mỗi connection cần thread riêng, scheduler của MySQL phải chạy nhiều context switch → CPU tăng.
🔥 4. Flushing (ghi dữ liệu bẩn xuống disk)
- Khi nhiều dirty pages trong Buffer Pool → InnoDB chạy background flush threads.
- Nếu lượng ghi nhiều (INSERT, UPDATE, DELETE dồn dập) → CPU phải tính toán và ghi ra disk nhiều → CPU tăng.
🔥 5. Các hoạt động nền khác
- Change buffer merge: khi update/insert mà index chưa có trong Buffer Pool, MySQL phải merge lại.
- Adaptive hash index: MySQL tạo index tạm trong RAM để tăng tốc, nhưng xây dựng nó cũng ngốn CPU.
- Replication: thread SQL/IO phải parse và apply binlog.
📌 Nói ngắn gọn:
- Khi dữ liệu nằm gọn trong Buffer Pool và có index tốt → CPU MySQL thường rất nhẹ (5–10%).
- Khi Buffer Pool không đủ lớn, query không tối ưu, hoặc có nhiều kết nối đồng thời → CPU dễ nhảy lên 20–30% hoặc cao hơn.