คุณควรปิดการใช้งานแคชคิวรีด้วย
[mysqld]
query_cache_size = 0
จากนั้นรีสตาร์ท mysql ทำไมฉันถึงแนะนำว่า ???
Query Cache จะชนหัวกับ InnoDB เสมอ มันจะดีถ้า MVCC ของ InnoDB จะอนุญาตให้มีการสอบถามจากแคชแบบสอบถามหากการปรับเปลี่ยนไม่มีผลต่อการอ่านซ้ำสำหรับธุรกรรมอื่น ๆ น่าเสียดายที่ InnoDB ไม่ได้ทำเช่นนั้น เห็นได้ชัดว่าคุณมีคำถามจำนวนมากที่ได้รับการตรวจสอบความถูกต้องค่อนข้างเร็วและอาจไม่ถูกนำมาใช้ซ้ำ
สำหรับ InnoDB ภายใต้ MySQL 4.0 แคชแบบสอบถามถูกปิดใช้งานสำหรับการทำธุรกรรม สำหรับ MySQL 4.1+, InnoDB จะเล่นตำรวจจราจรเมื่ออนุญาตให้เข้าถึงแคชแบบสอบถามในแบบต่อตาราง
จากมุมมองของคำถามของคุณฉันจะบอกว่าเหตุผลในการลบแคชแบบสอบถามไม่ได้เป็นค่าใช้จ่ายมาก แต่ InnoDB จัดการอย่างไร
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการปฏิสัมพันธ์กับ InnoDB แคชแบบสอบถามโปรดอ่านหน้า 213-215 ของหนังสือเล่มนี้"High Performance MySQL (Second Edition)"
หากข้อมูลส่วนใหญ่ของคุณทั้งหมดคือ MyISAM คุณสามารถใช้แนวคิดดั้งเดิมของคุณในการใช้ SQL_NO_CACHE
หากคุณมีส่วนผสมของ InnoDB และ MyISAM คุณจะต้องค้นหายอดเงินที่เหมาะสมสำหรับแอปพลิเคชันของคุณโดยพิจารณาจากจำนวนแคชที่คุณพลาดไป ในความเป็นจริงหน้า 209-210 ของหนังสือเล่มเดียวกันชี้ให้เห็นเหตุผลของการพลาดแคช:
- แบบสอบถามไม่สามารถแคชได้เนื่องจากมีโครงสร้างแบบ nondeterministic (เช่น CURRENT_DATE) หรือเนื่องจากชุดผลลัพธ์มีขนาดใหญ่เกินกว่าที่จะจัดเก็บได้แบบสอบถามคิวที่ไม่สามารถลบได้ทั้งสองชนิดจะเพิ่มตัวแปรสถานะ Qcache_not_cached
- เซิร์ฟเวอร์ไม่เคยเห็นคิวรีมาก่อนดังนั้นจึงไม่มีโอกาสแคชผลลัพธ์
- ผลลัพธ์ของแบบสอบถามถูกแคชก่อนหน้านี้ แต่เซิร์ฟเวอร์ลบออก สิ่งนี้สามารถเกิดขึ้นได้เนื่องจากมีหน่วยความจำไม่เพียงพอที่จะเก็บไว้เพราะมีคนสั่งให้เซิร์ฟเวอร์ลบออกหรือเพราะมันไม่ถูกต้อง
และสาเหตุสำคัญของการแคชสูงที่ขาดหายไปโดยมีการสืบค้นที่ไม่สามารถสืบค้นได้บางส่วนอาจเป็น:
- แคชแบบสอบถามยังไม่อุ่น นั่นคือเซิร์ฟเวอร์ไม่ได้มีโอกาสเติมแคชด้วยชุดผลลัพธ์
- เซิร์ฟเวอร์กำลังดูข้อความค้นหาที่ไม่เคยเห็นมาก่อน หากคุณไม่มีการค้นหาซ้ำหลายครั้งสิ่งนี้สามารถเกิดขึ้นได้แม้ว่าแคชจะอุ่นขึ้นแล้ว
- มีการตรวจสอบแคชจำนวนมาก
อัพเดท 2012-09-06 10:10 EDT
ค้นหาข้อมูลที่อัปเดตล่าสุดของคุณคุณquery_cache_limit
ตั้งค่าเป็น 1048576 (1M) สิ่งนี้ จำกัด ชุดผลลัพธ์ใด ๆ ที่ 1M หากคุณเรียกคืนสิ่งที่ใหญ่กว่านี้ก็จะไม่ถูกแคช ในขณะที่คุณquery_cache_size
ตั้งค่าไว้ที่ 104857600 (100M) การทำเช่นนี้จะช่วยให้ได้ผลลัพธ์ที่แคช 100 รายการในโลกที่สมบูรณ์แบบเท่านั้น หากคุณทำการค้นหาหลายร้อยแบบสอบถามการกระจายตัวของข้อมูลจะมาค่อนข้างเร็ว คุณมี 4096 (4K) เป็นชุดผลลัพธ์ขนาดต่ำสุด น่าเสียดายที่ mysql ไม่มีกลไกภายในสำหรับการจัดเรียงข้อมูลแคชแบบสอบถาม
หากคุณต้องมีแคชแบบสอบถามและคุณมี RAM มากคุณสามารถดำเนินการดังต่อไปนี้:
SET GLOBAL query_cache_size = 0;
SELECT SLEEP(60);
SET GLOBAL query_cache_size = 1024 * 1024 * 1024;
เพื่อล้างแคชแบบสอบถาม คุณสูญเสียผลลัพธ์ที่แคชทั้งหมดดังนั้นให้เรียกใช้บรรทัดเหล่านี้ระหว่างชั่วโมงที่มีการใช้งานน้อย
ฉันจะกำหนดสิ่งต่อไปนี้ด้วย:
- query_cache_size = 1G
- query_cache_limit = 8M
ที่เหลือ 23G of RAM ฉันจะเพิ่มดังต่อไปนี้:
- innodb_buffer_pool_size = 12G
- key_buffer_size = 4G
ที่เหลือ 7G นี่ควรจะเพียงพอสำหรับการเชื่อมต่อ OS และ DB
โปรดทราบว่าคีย์บัฟเฟอร์จะแคชเฉพาะหน้าดัชนี MyISAM เท่านั้นในขณะที่ InnoDB Buffer Pool แคชข้อมูลและดัชนี
อีกหนึ่งคำแนะนำ: อัพเกรดเป็น MySQL 5.5 เพื่อให้คุณสามารถกำหนดค่า InnoDB สำหรับหลาย CPU และหลายเธรดสำหรับอ่าน / เขียน I / O
ดูโพสต์ก่อนหน้าของฉันเกี่ยวกับการใช้ MySQL 5.5 ร่วมกับการเข้าถึง CPU หลายตัวสำหรับ InnoDB
อัพเดท 2012-09-06 14:56 EDT
วิธีการของฉันในการล้างแคชแบบสอบถามค่อนข้างมากเพราะมันจะเก็บข้อมูลที่แคชไว้และก่อให้เกิดเซ็กเมนต์ RAM ที่แตกต่างอย่างสิ้นเชิง ตามที่คุณได้ชี้ให้เห็นในความคิดเห็นของคุณFLUSH QUERY CACHE
(ตามที่คุณแนะนำ) หรือRESET QUERY CACHE
จะดีกว่า เพื่อความกระจ่างเมื่อฉันพูดว่า "ไม่มีกลไกภายใน" ฉันหมายความอย่างนั้น จำเป็นต้องมีการจัดเรียงข้อมูลและต้องดำเนินการด้วยตนเอง มันจะต้องมีการ crontab'd
ถ้าคุณทำ DML (INSERTs, UPDATEs, DELETEs) บน InnoDB บ่อยกว่า MyISAM ฉันจะบอกว่าจะลบแคชของคิวรีทั้งหมดซึ่งฉันได้กล่าวไว้ในตอนแรก