Thursday, August 22, 2013

Speed MySQL Query

Khi database của bạn lớn/nhiều hoặc lượng truy cập và liên tục , chắc chắn MySQL sẽ chiếm rất nhiều tài nguyên và khiến server load cao. Để hạn giảm load cho server , chúng ta có thể cache lại kết quả của các lần query vào bộ nhớ RAM. Tính năng này được MySQL hỗ trợ từ phiên bản 4.0.1 trở lên, để enable chức năng này chúng ta cần đặt các giá trị sau vào file /etc/my.cnf :
Code:
query_cache_type = 1
query_cache_size = 256M
query_cache_limit = 2M
query_cache_type : enable or disable tính năng query cache (enable = 1 ; disable = 0)
query_cache_size : lượng RAM dành cho việc cache query result.
query_cache_limit: dung lượng tối đa của một query result mà mình cho phép cache.
- Kiểm tra xem query cache đã được kích hoạt hay chưa :
Code:
mysql> show variables like '%query_cache%';
+------------------------------+-----------+
| Variable_name                | Value     |
+------------------------------+-----------+
| have_query_cache             | YES       |
| query_cache_limit            | 2097152   |
| query_cache_min_res_unit     | 4096      |
| query_cache_size             | 268435456 |
| query_cache_type             | ON        |
| query_cache_wlock_invalidate | OFF       |
+------------------------------+-----------+
- Kiểm tra xem query cache đã hoạt động hay chưa :
Code:
mysql> show status like '%qcache%';
+-------------------------+----------+
| Variable_name           | Value    |
+-------------------------+----------+
| Qcache_free_blocks      | 17034    |
| Qcache_free_memory      | 36995488 |
| Qcache_hits             | 4455579  |
| Qcache_inserts          | 702176   |
| Qcache_lowmem_prunes    | 87400    |
| Qcache_not_cached       | 76260    |
| Qcache_queries_in_cache | 20198    |
| Qcache_total_blocks     | 78340    |
+-------------------------+----------+
Vài thông số quan trọng cần chú ý :
Qcache_free_memory : lượng RAM hiện tại còn trống (chưa sử dụng) cho việc cache. Nếu thông số này quá cao bạn có thể giảm query_cache_size xuống , nếu quá thấp thì nâng query_cache_size lên.
Qcache_hits : số lượng query được lấy trong cache ra sử dụng thay vì phải thực hiện “real query” đến CSDL.
Qcache_inserts : số lượng query đã được add vào cache.
Qcache_lowmem_prunes : mỗi khi vùng nhớ dành cho việc cache bị hết (Qcache_free_memory thấp), khi add thêm query vào cache MySQL cần phải giải phóng 1 ít bộ nhớ để chứa query này. Mỗi lần thu hồi vùng nhớ , con số này tăng lên 1. Nếu số này quá lớn chứng tỏ lượng RAM dành cho việc cache(query_cache_size) không đủ và cần phải tăng lên. Nếu số này bằng 0 thì lượng RAM dành cho cache quá lớn , cần giảm lại.
Qcache_queries_in_cache : số lượng query hiện tại đang được cache.
MySQL cung cấp cho bạn những bản my.cnf cho từng cấu hình, những mẫu cấu hình này bạn có thể xem trong thư mục /usr/share/mysql/
Tùy vào đáp ứng của tài nguyên bạn có thể sử dụng những cấu hình khác nhau. Để xem cấu hình nào phù hợp với mình bạn có thể dùng lệnh cat để xem sẽ thấy hướng dẫn cơ bản cho cấu hình đó.
Để lấy cấu hình my-large.cnf bạn muốn cho MySQL, bạn dùng lệnh: cp -f /usr/share/mysql/my-large.cnf /etc/my.cnf
Sau đó, restart lại mysql: /sbin/service mysqld restart
Một số hướng dẫn để tự tinh chỉnh cấu hình MySQL:
[mysqld]
key_buffer = 64M (cho hệ thống 1GB RAM), 128M (cho 2GB RAM), 256 (cho 4GB RAM)
join_buffer_size 
= 1M (cho 1GB RAM), 2M (cho 2GB RAM), 4M (cho 4GB RAM)
sort_buffer_size = 1M (cho 1GB RAM), 2M (cho 2GB RAM), 4M (cho 4GB RAM)
read_buffer_size = 1M (cho 1GB RAM), 2M (cho 2GB RAM), 4M (cho 4GB RAM)
read_rnd_buffer_size = 768K (cho 1GB RAM), 1536K (cho 2GB RAM), 3072K for 4GB (RAM)
myisam_sort_buffer_size = 32M (cho 1GB RAM), 64M (cho 2GB RAM), 128 (cho 4GB RAM)
query_cache_type = 1 (0 nghĩa là tắt, 1 là bật và 2 là chế độ "demand")
query_cache_size = 32M (cho 1GB RAM), 63M (cho 2GB RAM), 128M (cho 4GB RAM)
query_cache_limit = 1M (cho 1GB RAM), 2M (cho 2GB RAM), 4M (cho 4GB RAM)
thread_cache_size = 8 đến 64 tùy vào tài nguyên thừa của RAM
[isamchk]
key_buffer và sort_buffer = 64M (cho 1GB RAM), 128M (cho 2GB RAM), 256M (cho 4GB RAM)
read_buffer và write_buffer = 16M (cho 1GB RAM), 32M (cho 2GB RAM), 64M (cho 4GB RAM)
[myisamchk]
key_buffer và sort_buffer = 64M (cho 1GB RAM), 128M (cho 2GB RAM), 256M (cho 4GB RAM)
read_buffer và write_buffer = 16M (cho 1GB RAM), 32M (cho 2GB RAM), 64M (cho 4GB RAM)