🧩 Hiện tượng

Bạn nhận thấy MySQL trên Windows (XAMPP) dùng RAM tăng dần đến 7GB,
chỉ khi restart MySQL thì RAM mới giảm xuống còn khoảng 3.5GB, sau đó lại tăng dần trở lại (khoảng 5–7GB).


🧠 Giải thích nguyên nhân

Đây là hành vi bình thường của MySQL, không phải lỗi hay rò rỉ bộ nhớ.
Nguyên nhân chính là do InnoDB Buffer Pool — bộ nhớ đệm (cache) của MySQL được cấp phát để tăng tốc độ đọc/ghi dữ liệu.

MySQL không trả RAM về hệ điều hành, ngay cả khi rảnh, vì:

  • tận dụng bộ nhớ sẵn có để tăng hiệu năng,
  • Và việc cấp phát – thu hồi RAM liên tục sẽ làm giảm hiệu suất.

RAM chỉ giảm khi:

  • Bạn restart dịch vụ MySQL,
  • Hoặc hệ điều hành ép MySQL nhả RAM (swap / OOM).

🔍 Kiểm tra bộ nhớ InnoDB sử dụng

Bạn đã chạy:

SHOW STATUS LIKE 'Innodb_buffer_pool%';

và nhận được kết quả (tóm tắt quan trọng):

Tham sốGiá trịGiải thích
Innodb_buffer_pool_pages_total393,216Tổng số trang (mỗi trang 16KB) → tương đương ~6GB
Innodb_buffer_pool_pages_data82,760Số trang thực sự chứa dữ liệu
Innodb_buffer_pool_bytes_data~1.35 GBTổng dữ liệu thực đang dùng
Innodb_buffer_pool_pages_free310,140Số trang trống (chưa dùng đến)
Innodb_buffer_pool_pages_dirty0Không có dữ liệu chờ ghi ra đĩa (ổn định, không lỗi)

👉 Nghĩa là:
MySQL đã cấp phát 6GB RAM cho buffer pool,
nhưng mới dùng thực tế ~1.3GB dữ liệu.
Phần còn lại (~4.7GB) chỉ là vùng trống mà MySQL “giữ sẵn” để dùng tiếp.


⚙️ Cơ chế cache trong MySQL

InnoDB cache bao gồm:

Thành phầnMô tảTác dụng
innodb_buffer_pool_sizeDung lượng tối đa MySQL được phép giữ trong RAMCache dữ liệu + index InnoDB
query_cache_sizeCache kết quả truy vấn (cũ, thường tắt ở MySQL 5.7+)Nên tắt để tránh overhead
tmp_table_size, max_heap_table_sizeBộ nhớ cho bảng tạm khi xử lý truy vấnCó thể giới hạn để tránh “bùng RAM”
max_connectionsMỗi connection tiêu tốn RAM riêng (sort buffer, join buffer)Nên giới hạn nếu nhiều kết nối
performance_schemaDữ liệu giám sát nội bộCó thể tắt nếu không cần

🧩 Cách MySQL cấp phát RAM

Giả sử bạn có 8GB RAM:

  • innodb_buffer_pool_size hiện khoảng 6GB,
  • Hệ thống + PHP + OS chiếm thêm ~1.5GB,
    → nên tổng MySQL + OS ~7.5GB, khiến Windows báo MySQL “ăn” gần hết RAM.

Điều này không nguy hiểm nếu hệ thống vẫn chạy mượt, không swap.


🧰 Giải pháp tối ưu RAM cho máy 8GB

Bạn nên giảm buffer pool xuống còn 3GB để hệ thống ổn định và không chiếm quá nhiều tài nguyên.

Mở file cấu hình:

D:\xampp\mysql\bin\my.ini

Thêm hoặc chỉnh lại phần [mysqld]:

[mysqld]
innodb_buffer_pool_size = 3G
innodb_buffer_pool_instances = 3
max_connections = 100
tmp_table_size = 32M
max_heap_table_size = 32M
query_cache_type = 0
query_cache_size = 0
performance_schema = OFF

Sau đó restart MySQL.


🧾 Kết quả mong đợi sau khi tối ưu

TrướcSau khi chỉnh
MySQL chiếm ~7GB RAMGiới hạn tối đa ~3.0–3.5GB RAM
RAM không giảm trừ khi restartỔn định hơn, MySQL không vượt quá giới hạn
Dữ liệu cache ~1.3GBGiữ nguyên hiệu năng hợp lý
Windows mượt hơnÍt swap, CPU nhẹ hơn

🩺 Cách kiểm tra sau khi tối ưu

Chạy lại lệnh:

SHOW VARIABLES LIKE 'innodb_buffer_pool_size';
SHOW STATUS LIKE 'Innodb_buffer_pool%';

Xem lại kết quả:

  • innodb_buffer_pool_size nên hiển thị khoảng 3,221,225,472 bytes (≈ 3GB)
  • Innodb_buffer_pool_pages_total giảm tương ứng (khoảng 196,608 thay vì 393,216).

✅ Tóm tắt ngắn gọn

Vấn đềGiải thíchCách xử lý
RAM tăng dần 3.5 → 7GBMySQL giữ bộ nhớ cho cacheBình thường
RAM không giảm khi rảnhMySQL không trả RAM về OSBình thường
RAM giảm khi restartDo cache bị xóa khi restartBình thường
Máy có 8GB RAMMySQL chiếm quá caoGiảm innodb_buffer_pool_size xuống 3G
Cần ổn định hơnGiới hạn connection + tắt performance schemaTối ưu thêm