ในการใช้งาน Query Cache นั้นมีสิ่งที่ต้องคำนึงถึงด้วยคือ
- ขนาดของ Query Cache
- ขนาดเฉลี่ยนของผลลัพธ์
- ขนาดของ Query ที่ไม่ต้องการให้ Cache
MYSQL
- SHOW variables LIKE 'query_cache%';
จะแสดงผลออกมาได้เป็น
TEXT
- +------------------------------+-----------+
- | Variable_name | Value |
- +------------------------------+-----------+
- | query_cache_limit | 1048576 |
- | query_cache_min_res_unit | 1024 |
- | query_cache_size | 33554432 |
- | query_cache_type | ON |
- | query_cache_wlock_invalidate | OFF |
- +------------------------------+-----------+
ค่าต่างๆคือ
- query_cache_limit คือขนาดใหญ่สุดของผลลัพธ์ที่จะถูก Cache เอาไว้
- query_cache_min_res_unit คือขนาดเล็กที่สุดที่ถูกจองโดย Query Cache
- query_cache_size คือขนาดของ Query Cache ที่จองไว้เพื่อ Cache ผลลัพท์ทั้งหมด ถ้าเป็น 0 คือปิดการทำงาน Query Cache
- query_cache_type คือรูปแบบของการ Cache มี 3 ค่าคือ
- 0 ปิดการทำงาน Query Cache
- 1 เปิดการทำงานให้ Cache ทุกคำสั่งที่สามารถ Cache ได้ยกเว้นมีการใช้คำสั่ง SQL_NO_CACHE
- 2 เปิดการทำงานและจะ Cache ก็ต่อเมื่อใช้คำสั่ง SQL_CACHE - query_cache_wlock_invalidate คือเมื่อมีการเปลี่ยนแปลงในตารางระหว่างมีการ SELECT จะต้องรอให้การเปลี่ยนแปลงนั้นเสร็จก่อนเพื่อรอรับผลการ SELECT ที่เปลี่ยนไปด้วย
used memory = query_cache_size - qcache_free_memory
MYSQL
- SHOW status LIKE 'qcache_free_memory';
จะได้ผลลัพธ์ เช่น
TEXT
- +--------------------+-----------+
- | Variable_name | Value |
- +--------------------+-----------+
- | Qcache_free_memory | 10388616 |
- +--------------------+-----------+
จากตัวอย่างจะได้ปริมาณการใช้งานหน่วยความจำ
33554432-10388616 = 23165816 (~22 MB)
จากนั้นเราสามารถอัตราการใช้งานหน่วยความจำที่ถูกจองโดย Cache ได้จาก
fill ratio = ( used memory / query_cache_size ) * 100
จากตัวอย่างจะได้ fill ratio
(23165816 / 33554432) * 100 = ~69%
ซึ่งถ้า Fill ratio มีค่า < 25% แล้วถือว่า query_cache_size ใหญ่เกินไป
เราต้องพิจารณาร่วมกับ qcache_lowmem_prunes ร่วมด้วย
MYSQL
- SHOW status LIKE 'qcache_lowmem_prunes';
TEXT
- +----------------------+--------+
- | Variable_name | Value |
- +----------------------+--------+
- | Qcache_lowmem_prunes | 507199 |
- +----------------------+--------+
ถ้า Qcache_lowmem_prunes > 50 และ Fill Ratio > 80% ควรมีการเพิ่มขนาดของ query_cache_size
และอัตราการกระจาย (Fragment) ของ Cache
( Qcache_free_blocks / Qcache_total_blocks ) * 100
MYSQL
- SHOW status LIKE 'qcache_free_blocks';
TEXT
- +--------------------+-------+
- | Variable_name | Value |
- +--------------------+-------+
- | Qcache_free_blocks | 2692 |
- +--------------------+-------+
MYSQL
- SHOW status LIKE 'qcache_total_blocks';
TEXT
- +---------------------+-------+
- | Variable_name | Value |
- +---------------------+-------+
- | Qcache_total_blocks | 37271 |
- +---------------------+-------+
จากตัวอย่างเราจะได้
(2692 / 37271) * 100 = ~7%
ถ้าอัตราการกระจายตัว > 20% ควรมีการใช้คำสั่ง FLUSH QUERY CACHE บ่อยๆ