MySQL Query Cache for Performance

Vu The Giang
Edumall Engineering
3 min readFeb 28, 2019

Vấn đề

Hãy tưởng tượng, vào 1 ngày đẹp trời hệ thống của các bạn bỗng nhiên có rất nhiều Data đổ về vì 1 lý do nào đó (có thể là do sếp của bạn vung tay quá trán, đổ tiền vào marketing để thu hút user). Và hệ thống của bạn đột nhiên cảm thấy ì ạch, chạy nhanh như 1 con rùa. Bạn chắc mẩm là do sự phình to Database của bạn chính là nguyên nhân. Nhưng bạn vẫn vò đầu bứt tai vì chẳng biết mình Code “ngu” ở đâu. Và thế là công cuộc refactoring code bắt đầu. Bạn phải đi review từng dòng code, tối ưu từng câu query 1. Dĩ nhiên đó là 1 trong số những điều bắt buộc phải làm.

Giải pháp

Nhưng tôi là 1 kẻ lười, rất lười. Thay vì đi tìm những câu query “ngu” tôi đi tìm phương án nào đó có ảnh hưởng lên tất cả hệ thống, thay vì ảnh hưởng đến 1 chức năng nào đó. Và 1 trong số các phương án tôi lượm nhặt được đó là “Caching Database”, dĩ nhiên trong trường hợp này là “Caching MySQL” vì tôi toàn làm việc với nó là chủ yếu. Nếu bạn có gặp vấn đề tương tự với các Database khác vui lòng hỏi ông GG nhé.

Chuẩn bị

  • Dĩ nhiên là bạn phải cài đặt MySQL với version có hỗ trợ caching. Để xác định xem DB của bạn có hỗ trợ caching không, bạn có thể check bằng câu query sau:
mysql> show variables like 'have_query_cache';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| have_query_cache | YES |
+------------------+-------+
  • Giờ ta cần kiểm tra 1 số thông số sau:
mysql> show variables like 'query%';
+------------------------------+---------+
| Variable_name | Value |
+------------------------------+---------+
| query_alloc_block_size | 8192 |
| query_cache_limit | 1048576 |-> Dung lượng tối đa cache
| query_cache_min_res_unit | 4096 |
| query_cache_size | 8388608 |-> Dung lượng cache (byte)
| query_cache_type | ON |-> Cache được enable
| query_cache_wlock_invalidate | OFF |
| query_prealloc_size | 8192 |
+------------------------------+---------+

Cấu hình

Đến đây chúng ta cần cấu hình trong các file *.cnf của MySQL. Thông thường MySQL sẽ tự động import các cấu hình trong các file *.cnf được chứa trong thư mục /etc/mysql/conf.d/ Do đó ta tạo 1 file caching.cnf trong folder trên với nội dung như sau:

query_cache_size = 1B
query_cache_type = 1
query_cache_limit= 2G

Ở đây với cấu hình RAM của server là từ 16 -> 32 GB, tôi khuyến khích các bạn đặt cấu hình như trên. Với các server có lượng tài nguyên hạn hẹp hơn, chúng ta có thể set giá trị tương ứng để phù hợp.

Ngoài ra có 1 lưu ý với “query_cache_type”, ở đây chúng ta có 3 loại giá trị:

  • query_cache_type = 0: Không sử dụng cache cho MySQL
  • query_cache_type = 1: Lưu trữ các kết quả của các câu query mà không được bắt đầu bằng “SELECT S_NO_CACHE”
  • query_cache_type = 2: Chỉ lưu trữ với các câu query được bắt đầu bằng “SELECT SQL_CACHE”

Sau đó ta cần khởi động lại service của MySQL và cảm nhận

Ngoài lề

Bằng phương pháp này chúng ta có thể tăng tốc câu query lên khá nhiều lần. Tuy nhiên nó chỉ có tác dụng với các câu query được thực hiện từ lần thứ 2 trở đi thôi nhé, vì bản chất là nó cache lại kết quả của các câu query đã thực hiện mà.

Chúc bạn may mắn.

Thank for reading.

--

--