จะกำหนด sort_buffer_size ที่เหมาะสมได้อย่างไร?


10

ฉันอ่านจากไฟล์กำหนดค่าตัวอย่างซึ่งระบุสิ่งต่อไปนี้:

# Sort buffer is used to perform sorts for some ORDER BY and GROUP BY
# queries. If sorted data does not fit into the sort buffer, a disk
# based merge sort is used instead - See the "Sort_merge_passes"
# status variable. Allocated per thread if sort is needed.

ฉันมีคำถามสองสามข้อที่ใช้ filesort ฉันจะกำหนดขนาดของบัฟเฟอร์ที่ฉันต้องการให้คิวรีทำงานได้อย่างราบรื่นโดยไม่ต้องกดปุ่มดิสก์ได้อย่างไร


ให้คุณเรียกใช้mysqltunerหรือจูนไพรเมอร์คุณอาจเห็นบางสิ่งที่น่าสนใจเกี่ยวกับ my.cnf ของคุณในแอพเหล่านี้
David Martinez

คำตอบ:


14

มีเพียงตัวแปรสถานะหนึ่งที่ให้ความสำคัญเกี่ยวกับsort_buffer_size นั่นคือสิ่งที่คุณมีในด้านหลังข้อความในคำถาม: Sort_merge_passes เอกสาร MySQL กล่าวว่า:

Sort_merge_passes: จำนวนการผสานที่อัลกอริทึมการเรียงต้องทำ หากค่านี้มีขนาดใหญ่คุณควรพิจารณาเพิ่มค่าของตัวแปรระบบsort_buffer_size

โปรดจำไว้สิ่งหนึ่งเกี่ยวกับsort_buffer_size

หากคุณเห็น Sort_merge_passes ต่อวินาทีจำนวนมากในเอาต์พุต SHOW GLOBAL STATUS คุณสามารถพิจารณาเพิ่มค่า sort_buffer_size เพื่อเพิ่มความเร็วในการดำเนินการ ORDER BY หรือ GROUP BY ที่ไม่สามารถปรับปรุงได้ด้วยการปรับให้เหมาะสมของแบบสอบถามหรือปรับปรุงดัชนี

ในขณะที่การเลี้ยงsort_buffer_sizeสามารถช่วยให้ค้นหาด้วยGROUP BYs และORDER BYs คุณจะดีกว่าการปรับปรุงแบบสอบถามที่คุณสามารถปรับปรุงและเพิ่มดัชนีที่สามารถใช้โดย Query Optimizer

คำถามยังคงอยู่: คุณตรวจสอบSort_merge_passes ได้อย่างไร ?

ใช้รหัสนี้เพื่อตรวจสอบจำนวน Sort_merge_passes ที่เกิดขึ้นในช่วง 5 นาทีที่ผ่านมา นอกจากนี้ยังคำนวณ Sort_merge_passes ต่อชั่วโมง

SET @SleepTime = 300;
SELECT variable_value INTO @SMP1
FROM information_schema.global_status WHERE variable_name = 'Sort_merge_passes';
SELECT SLEEP(@SleepTime) INTO @x;
SELECT variable_value INTO @SMP2
FROM information_schema.global_status WHERE variable_name = 'Sort_merge_passes';
SET @SMP = @SMP2 - @SMP1;
SET @SMP_RATE = @SMP * 3600 / @SleepTime;
SELECT @SMP,@SMP_RATE;

หากคุณพบ Sort_merge_passes และอัตราสูงเกินไปคุณสามารถเพิ่มsort_buffer_sizeได้ฟรี สมมติว่าคุณต้องการเพิ่มเป็น 4M คุณจะเรียกใช้สิ่งนี้:

mysql> SET GLOBAL sort_buffer_size = 1024 * 1024 * 4;

จากนั้นคุณจะเพิ่มลงใน my.cnf

[mysqld]
sort_buffer_size = 4M

คุณจะเรียกใช้รหัสเป็นระยะเพื่อตรวจสอบเวลาอื่นSort_merge_passes spikes


2
นี่เป็นคำตอบที่ดีกว่ามาก
เกร็ก

7
@RolanoMySQLDBA คุณสามารถกำหนด "มาก" ในต่อไปนี้: "ถ้าคุณเห็น Sort_merge_passes ต่อวินาที"
Tarek

2

คุณไม่จำเป็นต้องเปลี่ยน sort_buffer_size จากค่าเริ่มต้น คุณเข้าใจผิดว่าใช้งานตามคำถาม คุณควรเริ่มต้นด้วยการตรวจสอบ SQL เพื่อดูว่าคุณสามารถปรับแต่งมันและปฏิบัติตามเงื่อนไข ORDER BY / GROUP BY โดยใช้ดัชนีหรือไม่ โดยทั่วไปจะเป็นดัชนีคอมโพสิต

เพิ่มเติม: http://www.xaprb.com/blog/2010/05/09/how-to-tune-mysqls-sort_buffer_size/


ขออภัยที่ต้องบอกว่าฉันพบว่าโพสต์มีประโยชน์แทบจะไม่ มันเหมือนกับบอกคนอื่นว่าอย่าทำอะไรเพียงเพราะคุณไม่ใช่ผู้เชี่ยวชาญ ตามที่ผู้วิจารณ์คนแรกชี้ให้เห็น.cnfไฟล์ตัวอย่างที่ส่งมาพร้อมกับ mysql จะไม่ใช้การตั้งค่าเริ่มต้น
คำถามล้น

ถ้าคุณอ่านมันอีกครั้งมันก็บอกว่าผู้เชี่ยวชาญรู้แล้วว่าจะไม่เปลี่ยนค่าจากค่าเริ่มต้น ไม่ควรใช้ไฟล์. cnf ตัวอย่างหรืออ้างอิงเป็นแนวปฏิบัติที่ดี หากคุณต้องการความช่วยเหลือในการสร้างไฟล์ my.cnf Percona มีตัวช่วยสร้างที่ค่อนข้างละเอียด tools.percona.com/wizard
eroomydna

2

คำแนะนำในคู่มือ (5.0-5.5) คือ

หากคุณเห็น Sort_merge_passes ต่อวินาทีจำนวนมากในเอาต์พุต SHOW GLOBAL STATUS คุณสามารถพิจารณาเพิ่มค่า sort_buffer_size เพื่อเพิ่มความเร็วในการดำเนินการ ORDER BY หรือ GROUP BY ที่ไม่สามารถปรับปรุงได้ด้วยการปรับให้เหมาะสมของแบบสอบถามหรือการทำดัชนีที่ปรับปรุง บัฟเฟอร์ทั้งหมดได้รับการจัดสรรแม้ว่าจะไม่จำเป็นทั้งหมดดังนั้นการตั้งค่าให้ใหญ่กว่าที่ต้องการทั่วโลกจะทำให้คิวรีส่วนใหญ่ที่เรียงลำดับช้าลง เป็นการดีที่สุดที่จะเพิ่มเป็นการตั้งค่าเซสชันและเฉพาะสำหรับเซสชันที่ต้องการขนาดที่ใหญ่กว่าเท่านั้น บน Linux มีขีด จำกัด ที่ 256KB และ 2MB ซึ่งค่าที่มากขึ้นอาจทำให้การจัดสรรหน่วยความจำช้าลงอย่างมากดังนั้นคุณควรพิจารณาอยู่ต่ำกว่าหนึ่งในค่าเหล่านั้น ทดลองหาค่าที่ดีที่สุดสำหรับภาระงานของคุณ

จาก 5.6 เป็นต้นไปถ้อยคำบ่งชี้ว่าเครื่องมือเพิ่มประสิทธิภาพสามารถเลือกค่าสำหรับแบบสอบถามและเซิร์ฟเวอร์สามารถขยายบัฟเฟอร์ได้ถึงขีด จำกัด สิ่งนี้จะช่วยลดต้นทุนในการตั้งค่าที่สูงเกินไป ดังนั้นดูเหมือนว่าคุณอาจต้องการอนุรักษ์นิยมต่ำกว่าค่าเริ่มต้น (เช่นเดียวกับไฟล์ release cnf) สำหรับรีลีสที่ต่ำกว่า 5.6.4 แต่อาจมีข้อ จำกัด ที่สูงกว่าในการพูดว่า 2MB เริ่มต้นหรือมากกว่านั้นจาก 5.6 4 เนื่องจากไม่ได้จัดสรรแบบเต็มจำนวน

ในฐานะของ MySQL 5.6.4 เครื่องมือเพิ่มประสิทธิภาพพยายามหาจำนวนพื้นที่ที่ต้องการ แต่สามารถจัดสรรได้มากถึงขีด จำกัด


1

วิธีที่ดีที่สุดในการพิจารณาสิ่งที่ดีที่สุดsort_buffer_sizeคือการกำหนดมาตรฐาน

อย่างไร? เช่น @RolandoMySQLDBA กล่าวว่าการตรวจสอบSort_merge_passesอาจมีประโยชน์ แต่นั่นไม่ใช่ปัจจัยเดียวที่ส่งผลต่อประสิทธิภาพ sort_buffer_sizeคุณควรจะระมัดระวังเมื่อคุณเพิ่ม

เอกสารบอกว่า

บน Linux มีขีด จำกัด ที่ 256KB และ 2MB ซึ่งค่าที่มากขึ้นอาจทำให้การจัดสรรหน่วยความจำช้าลงอย่างมากดังนั้นคุณควรพิจารณาอยู่ต่ำกว่าหนึ่งในค่าเหล่านั้น

มีโพสต์เกี่ยวกับการทดสอบซึ่งสรุปได้ว่า

sort_merge_passesไม่เลว ตั้งค่าของคุณให้sort_buffer_sizeใหญ่พอที่จะมีค่าศูนย์sort_merge_passesอาจไม่เหมาะสม

เมื่อฉันทดสอบฉันก็จะได้ผลลัพธ์เช่นเดียวกัน

sort_buffer_sizeอุดมคติมันจะดีที่สุดเพื่อหลีกเลี่ยงสถานการณ์ที่คุณต้องการเพื่อเพิ่มประสิทธิภาพ อย่างไร? เอกสารการสั่งซื้อเพิ่มประสิทธิภาพนี้อาจช่วยให้คุณเข้าใจว่าสิ่งต่าง ๆ ทำงานอย่างไรภายใต้ประทุน


-1

"mysql> SET GLOBAL sort_buffer_size = 1024 * 1024 * 4;" มันเป็นวิธีที่ไม่ดีในการใส่ขนาดบัฟเฟอร์การจัดเรียงใน 4m นั่นทำให้ขนาดบัฟเฟอร์การจัดเรียงมีการใช้งาน 4GB

"mysql> SET GLOBAL sort_buffer_size = 1024 * 4;"

หากฉันเป็นคุณฉันไม่พยายามเปลี่ยนขนาดบัฟเฟอร์สั้น ๆ นั่นเป็นวิธีที่ดีในการทำให้เซิร์ฟเวอร์ของคุณทำงานล้มเหลวและส่งไปยังถังขยะ ลองค้นหาให้ดีกว่านี้


1
การจัดเรียงขนาดใหญ่จะเกิดขึ้นได้อย่างไรในบัฟเฟอร์การจัดเรียง 4K? 1024 * 4โปรดทราบว่าคุณกล่าวว่า นั่นคือ 4096, 4K
RolandoMySQLDBA

สิ่งที่ Rolando พูด ^^ และค่าต่ำสุดที่อนุญาตคือ 32K
ypercubeᵀᴹ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.