ตัวเลือกการกำหนดค่าใดสำหรับ MySQL ให้การปรับปรุงความเร็วที่ใหญ่ที่สุด


29

ตัวเลือกการกำหนดค่าใดสำหรับ MySQL ให้การปรับปรุงความเร็วที่ใหญ่ที่สุด

ฉันสงสัยเกี่ยวกับการปรับปรุงแฟ้มการกำหนดค่าจริงประเภทตารางการตั้งค่าฮาร์ดแวร์การจำลองแบบและอื่น ๆ นอกจากโครงสร้างแบบสอบถามและโครงสร้างตาราง (สิ่งเหล่านี้หาได้ง่ายในเว็บไซต์และ Stack Overflow) สิ่งต่าง ๆ เช่นการตั้งค่าแคชแบบสอบถามทำให้คุณมีความเร็วมากที่สุดหรือไม่ วิธีการเกี่ยวกับไดรฟ์ มันจะดีกว่าที่จะมีมันบน RAID ภายนอกหรือภายใน? การจำลองแบบให้ประสิทธิภาพที่ดีขึ้นหรือไม่โดยเฉพาะอย่างยิ่งเมื่ออ่านข้อความค้นหาขนาดใหญ่

คุณได้ทำการตั้งค่า / การเปลี่ยนแปลงอื่นใดเพื่อปรับปรุงประสิทธิภาพของ MySQL?

หมายเหตุ: ฉันรู้ว่าสิ่งเหล่านี้ขึ้นอยู่กับการใช้งานเป็นอย่างมาก (นั่นคือเว็บไซต์ขนาดเล็กเทียบกับคลังข้อมูล) แต่เนื่องจากฉันคิดว่าส่วนใหญ่เราอาจทำงานบนเว็บไซต์ / ระบบที่หลากหลายจึงเป็นการดีที่จะทราบเทคนิคที่หลากหลายที่สามารถนำไปใช้ได้ สถานการณ์ นอกจากนี้ฉันคิดว่าเทคนิคบางอย่างสามารถถ่ายโอนระหว่างสถานการณ์


ไม่เกี่ยวข้องทั้งหมด แต่คุณควรใช้ InnoDB สำหรับต้นแบบ คุณสามารถทำซ้ำกับ MyISAM ทาสและใช้การค้นหาข้อความแบบเต็มในตัวซึ่งสามารถทำการค้นหาข้อความได้เร็วกว่า LIKE
Neil McGuigan

คำตอบ:


20

นี่คือคำแนะนำของฉัน (ระยะของคุณอาจแตกต่างกันไป)

  • ใช้ฮาร์ดแวร์ RAID สิ่งนี้ขัดกับคำแนะนำของฉันในการใช้ซอฟต์แวร์ RAID ในโพสต์อื่น ๆ อย่างไรก็ตามนี่เป็นสถานการณ์เฉพาะที่คุณต้องการการ์ด RAID ของฮาร์ดแวร์ คุณต้องการให้แบตเตอรี่ NVRAM สำรองไว้บนการ์ด RAID เพื่อลดเวลาในการ fsync ไฟล์บันทึกลงดิสก์
  • ใช้โวลุ่ม RAID 1 หรือ RAID 10 เท่านั้น ค่าใช้จ่ายในการเขียน RAID 5 หรือ 6 สูงเกินไปที่จะทนต่อภาระการอ่าน / เขียนแบบผสม
  • ใช้ LUNs แยกต่างหากสำหรับข้อมูลบันทึกและวอลุ่ม tmp สิ่งเหล่านี้ควรแยกจาก OS และสลับโวลุ่ม
  • ใช้InnoDB
  • ใช้ innodb_file_per_table
  • ใช้ระบบปฏิบัติการ 64 บิต
  • ตั้งค่าพูลบัฟเฟอร์ InnoDB ของคุณเป็น ~ 80% ของ RAM ที่มีอยู่
  • ตั้งค่าล็อกไฟล์เป็น 1/4 ของขนาดพูลบัฟเฟอร์ของคุณระหว่าง 2 ถึง 4 ไฟล์บันทึก ไฟล์บันทึกขนาดใหญ่หมายถึงการปิดระบบช้าลงและเวลาการกู้คืนช้าลง แต่ให้คุณกู้คืนฐานข้อมูลขนาดใหญ่ได้เร็วขึ้น
  • log_slow_queries, log-query-not-using-indexes, set-variable = long_query_time = 1, ตรวจสอบทุกแบบสอบถามในบันทึกนั้น refactor schema ของคุณเพื่อหลีกเลี่ยงการสแกนตารางและตาราง tmp ทุกครั้งที่ทำได้

11

อีกครั้ง Dave Cheney เคาะออกจากสวนสาธารณะที่นี่จริงๆ ฉันไม่สามารถเพิ่มสิ่งใด ๆ ในคำตอบสำหรับคำถามของคุณ อย่างไรก็ตามฉันต้องการชี้ให้เห็นสิ่งที่คุณไม่ได้ถาม ดังที่ Jeremy Zawodny และ Peter Zaitsev สอนผมเมื่อหลายปีก่อน ROI ของคุณที่ใช้เวลาในการติดตามและเพิ่มประสิทธิภาพการสืบค้นที่ไม่ดีกำลังจะออกไปทำ ROI ของคุณตามเวลาที่ใช้ในการเปลี่ยนแปลงการกำหนดค่า 10 เท่า แน่นอนว่าคุณไม่ต้องการมีการกำหนดค่าที่ไม่ดีการตั้งค่า RAID ผิดหรือ RAM ไม่เพียงพอ แต่ในหมู่ที่ดีเยี่ยมและยังร่อแร่ MySQL DBAs คำสั่งที่ไม่ดี (มักจะมาจากนักพัฒนา / กรอบไม่ DBA) ที่เป็นเรื้อรังเงื่อนไขที่กำหนดค่าที่ไม่ดีเป็นทนหนึ่ง

(ฉันขุดหาคำคุณศัพท์เหล่านั้นชั่วครู่หนึ่งและยังไม่พอใจกับสิ่งที่ฉันเลือก)

ฉันอยากจะย้ำอีกครั้งว่าถ้านักพัฒนาของคุณใช้ ORM เหมือนคนทั่วไปในเฟรมเวิร์กเช่น Ruby on Rails และ Django คุณต้องตรวจสอบคำถามที่เข้ามาถึงฐานข้อมูลของคุณ เมื่อนักพัฒนาหยุดคิดเกี่ยวกับ SQL และปล่อยให้ฐานข้อมูลหายไปสิ่งที่น่ารังเกียจจริงๆก็คืบคลานเข้ามาฉันรักสองเฟรมเวิร์กที่ฉันเพิ่งพูดถึง (อย่าลงคะแนนให้ฉันเพราะปากแย่) มันทำให้ Query Sleuthing สำคัญมาก (อ่าน: ความมั่นคงของงาน)


4

บางสิ่งอื่น ๆ (ซึ่งไม่ได้กล่าวถึงในคำตอบของ Dave Cheney)

  • ลองตั้งค่า innodb_flush_method เป็น O_DIRECT เพื่อหลีกเลี่ยงการบัฟเฟอร์ข้อมูลซ้ำซ้อน หลีกเลี่ยงสิ่งนี้หากการ์ด RAID ของคุณไม่มีแคชการเขียนสำรองแบตเตอรี่หรือข้อมูลของคุณอยู่ใน SAN

  • เล่นกับ innodb_thread_concurrency ด้วย ฉันเชื่อว่าค่าเริ่มต้นคือ 8 แต่มันก็คุ้มที่จะปรับแต่งเพื่อดูว่ามันช่วยเพิ่มประสิทธิภาพหรือไม่

  • ตรวจสอบให้แน่ใจว่าแคชคิวรีเปิดอยู่และตรวจสอบสถิติเพื่อดูอัตราการเข้าชม ถ้ามันดีลองเพิ่มมันเพื่อดูว่ามันช่วยเพิ่มอัตราการเข้าชม

  • คุณอาจสามารถเปลี่ยนระดับการแยกเริ่มต้นขึ้นอยู่กับแอปพลิเคชันที่เรียกใช้ ค่าเริ่มต้นคือ REPEATABLE_READ แต่ READ_COMMITTED อาจให้ประสิทธิภาพที่ดีขึ้น

  • หากข้อความสั่งของคุณส่วนใหญ่เป็น UPDATE และ DELETE คุณสามารถลองทำแคชบนสลาฟได้โดยการเลือกคิวรีที่ส่งคืนชุดผลลัพธ์ที่จะแก้ไข ลองใช้เครื่องมือmk-slave-prefetchซึ่งจะทำสิ่งนี้ให้คุณ

  • ดูที่เครื่องมือเก็บข้อมูลอื่น ๆ นอกเหนือจาก MyISAM และ InnoDB


3

ไม่สามารถพูดอะไรเกี่ยวกับฮาร์ดแวร์ แต่คุณอาจลองhttp://blog.mysqltuner.com มันเป็นสคริปต์ Perl ที่วิเคราะห์การตั้งค่า MySQL ของคุณ

คุณสามารถดูตัวอย่างผลลัพธ์ได้ที่http://www.thomas-krenn.com/de/wiki/MySQL_Performance_Tuning#mysqltuner.pl


1

สิ่งทั่วไปสิ่งแรกที่คุณควรทำคือดูพารามิเตอร์หน่วยความจำ การตั้งค่าเริ่มต้นสำหรับ MySQL นั้นค่อนข้างอนุรักษ์นิยมมาก กลไกใด ๆ ที่คุณใช้คุณอาจจะต้องเพิ่มพารามิเตอร์หน่วยความจำหลายสิบหรือแม้แต่ร้อยเท่า

สิ่งต่อไปที่คุณควรทำคือดูที่แคชตาราง ค่าเริ่มต้นคือ 64 ซึ่งจะมีประโยชน์เฉพาะในกรณีที่คุณมีไม่เกิน 60 ตาราง คุณจะต้องการยกระดับนั้นนาน

สิ่งที่สามที่คุณควรทำคือดูที่เธรดและพารามิเตอร์การเชื่อมต่อ ค่าเริ่มต้น wait_timeout นั้นยาวมากสำหรับแอพพลิเคชั่นบนเว็บส่วนใหญ่และสามารถลดลงเหลือ 30 วินาที สิ่งนี้จะปรับปรุงการใช้หน่วยความจำเช่นกันเนื่องจาก MySQL จะทำการเชื่อมต่อได้เร็วขึ้นทำให้การวางอยู่ในสถานะ 'สลีป' น้อยลง

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