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.