
Thời đại AI và bạn dễ dàng deploy MySQL lên, cách đơn giản nhất là:
"Hãy viết cho tôi docker compose để deploy mysql"
AI trong vòng 3 giây sẽ trả ngay cho bạn response sau:
version: '3.8'
services:
mysql:
image: mysql:8.0
container_name: mysql_server
restart: always
environment:
MYSQL_ROOT_PASSWORD: my_secure_root_password
MYSQL_DATABASE: my_database
MYSQL_USER: my_user
MYSQL_PASSWORD: my_password
ports:
- "3306:3306"
volumes:
- mysql_data:/var/lib/mysql
volumes:
mysql_data:
Tuyệt quá, chạy thử xem nào:
docker compose up -d
Và MySQL chạy đúng như bạn mong đợi, cắm backend vào thử, ngon quá, tốt quá rồi!
Mình đã trở thành DevOps Engineer
Hoặc chi ít là vậy, nếu sự cố vài ngày sau đó không xảy ra.
Ram tổng server có 16GB RAM
Container MySQL chỉ đang dùng có 1GB RAM
Nhưng mỗi query, cho select theo id, dù là đơn giản nhất tốn tới gần 1 giây.
Tại sao?
Bạn lại đi hỏi con AI dấu yêu của bạn
AI đáp
"Bạn hãy thử kiểm tra xem có query nặng nào đang giữ thread không"
"Bạn hãy thử kiểm tra xem có bảng đó có đánh index chưa"
Thử hết tất cả, và tất nhiên là vẫn không có tác dụng. Đó là lý do vì sao chúng ta có bài viết này.
Series này sẽ tổng hợp cho bạn tất tần tật những thứ quan trọng mà bạn không để ý khi setup MySQL, xoáy sâu vào file docker-compose ban đầu mà AI kia generate, mình sẽ cùng bạn soi lõi sai của file này.
Lỗi đầu tiên, và cũng là bài đầu tiên trong series:
Chính xác đây là nguyên nhân quan trọng nhất gây nên tình trạng mà mình đã đề cập ở đầu bài viết.
Nếu bạn nóng vội thì để sửa lỗi trên, chỉ cần set thêm:
--innodb_buffer_pool_size=
Vậy là xong. Lỗi được fix, giá trị điền vào innodb_buffer_pool_size là bao nhiêu tùy thuộc mức bạn ước lượng cho traffic hệ thống của bạn.
Nhưng bạn chỉ biết tới nhiêu đó, thì bạn dở.
Bạn nên hiểu sâu hơn chút xíu
Đầu tiên cần biết:
Để hiểu tường tận và trực quan nhất về innodb_buffer_pool_size, bạn hãy tưởng tượng:
Bạn có chơi Minecraft không? Ổ cứng giống như cả cái kho đồ. RAM giống như cái bàn chế tạo - crafting table của bạn vậy

Mỗi khi bạn cần tìm dữ liệu (đọc một trang sách) hoặc sửa dữ liệu (viết vào trang sách):
innodb_buffer_pool_size chính là diện tích mặt bàn làm việc mà bạn cấp cho MySQL.
Trong storage engine InnoDB, dữ liệu trên đĩa không được lưu rải rác từng dòng nhỏ lẻ, mà chia thành từng khối gọi là Page (mặc định mỗi page nặng 16 KB).
Buffer Pool là một vùng RAM chuyên dụng để chứa các Page này. Nó đảm nhận hai nhiệm vụ sống còn:
Khi bạn chạy SELECT * FROM users WHERE id = 100:
id = 100 (và cả cây Index B-Tree tương ứng) đã có trong Buffer Pool chưa.Khi bạn chạy UPDATE hoặc INSERT:
Hay quá, vậy hỏi tiếp, bộ nhớ RAM có giới hạn, trong khi dữ liệu database ngày một lớn. Khi Buffer Pool bị đầy, làm sao MySQL biết phải vứt trang nào ra khỏi RAM để đón trang mới?
Key ở đây là InnoDB dùng một biến thể nâng cao của thuật toán LRU (Least Recently Used):

SELECT * FROM big_tablequét qua 10GB dữ liệu:innodb_old_blocks_time).Quay trở lại, ván cờ, vậy thì câu hỏi đặt ra là:
iowait trên server tăng vọt). Các câu truy vấn đơn giản bắt đầu phản hồi chậm chạp, ứng dụng rơi vào tình trạng giật lag dù CPU và RAM của server vẫn đang trống rất nhiều.sort_buffer_size, join_buffer_size, bộ nhớ chạy OS, hệ điều hành cache file system...mysqld. Database sập đột ngột không báo trước.Đừng lo, mình có CÔNG THỨC cho bạn
Loại máy chủ | Công thức khuyến nghị cho innodb_buffer_pool_size |
|---|---|
Dedicated DB Server (Chỉ cài MySQL) | 60% – 75% tổng RAM của server. (Ví dụ: Máy 16GB RAM → Đặt tầm 10G đến 11G) |
Shared Server (Cài chung web backend, Redis...) | 30% – 50% tổng RAM, phải tính dư dả cho các app khác. |
innodb_buffer_pool_instances = 8Biết cách trị bệnh rồi, vậy BẮT BỆNH thế nào?
Chạy câu lệnh sau trong MySQL:
SHOW GLOBAL STATUS LIKE 'Innodb_buffer_pool_read%';Hãy chú ý 2 thông số:
Innodb_buffer_pool_read_requests: Tổng số lần MySQL cần đọc Page.Innodb_buffer_pool_reads: Số lần MySQL phải mò xuống tận ổ cứng vì trong Buffer Pool không có.Tỷ lệ Hit Rate tính bằng:

Sẵn nói về Buffer Pool, có nhiều thứ hay ho về cái này mà mình muốn chia sẻ lắm, ví dụ:
Nhưng mình sẽ để trong bài viết khác, để còn content mà viết nữa.
Mình kết thúc ở đây nhé. Cảm ơn các bạn đã đọc.
Gợi ý dựa trên chuyên mục, nội dung tương tự và bài viết được độc giả quan tâm nhất