การแบ่งพาร์ติชัน MySQL: มีการแลกเปลี่ยนประสิทธิภาพระหว่างจำนวนพาร์ติชันและขนาดของแต่ละพาร์ติชันหรือไม่?


10

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

หมายเหตุ: มีคำถามที่ค่อนข้างคล้ายกันเกี่ยวกับ stackoverflow อยู่แล้วแต่มีเพียงหนึ่งคำตอบซึ่ง (จากมุมมองของฉัน) คิดถึงเครื่องหมาย ดังนั้นฉันจะระบุคำถามในแบบของฉันเอง ... หวังว่ามันจะชัดเจนยิ่งขึ้น

คำตอบ:


6

มาเปรียบเทียบกัน

ขนาดพาร์ติชั่น

หากคุณมีดังต่อไปนี้:

  • 100 ล้านแถวในตาราง
  • การจัดทำดัชนี BTREE
  • แต่ละเพจใน BTREE มี 1024 ปุ่ม

การวัดจะมีลักษณะอย่างไร

เนื่องจาก LOG (100000000) / LOG (2) = 26.575424759099 ดัชนี BTREE ที่มี 1024 คีย์ต่อหน้า treenode จะมีความสูงของต้นไม้เพียง 3 (CEILING (LOG (100000000) / LOG (1024))) ด้วยโหนดเพียงสามหน้าการค้นหาแบบไบนารีสำหรับคีย์ที่จำเป็นในแต่ละ treenode ที่เข้าถึงได้จะส่งผลให้มีการตัดและแยกคีย์ประมาณ 30 คีย์

จำนวนพาร์ทิชัน

หากคุณมีดังต่อไปนี้:

  • 100 ล้านแถวในตาราง
  • การจัดทำดัชนี BTREE
  • แต่ละเพจใน BTREE มี 1024 ปุ่ม
  • คุณสร้าง 1024 parititions

ตัวเลขจะแตกต่างกันเล็กน้อย

แต่ละพาร์ติชั่นควรมีประมาณ 97656 แถว การวัดจะกลายเป็นอะไรในตอนนี้

เนื่องจาก LOG (97656) / LOG (2) = 16.575421065795 ดัชนี BTREE ที่มี 1024 คีย์ต่อหน้า treenode จะมีความสูงของต้นไม้เพียง 2 (CEILING (LOG (97656) / LOG (1024))) ด้วยโหนดเพจเพียงสองหน้าการค้นหาแบบไบนารี่สำหรับคีย์ที่จำเป็นในแต่ละ treenode ที่เข้าถึงได้จะส่งผลให้มีการตัดและแยกคีย์ประมาณ 20 คีย์

สรุปผลการศึกษา

การแพร่กระจายคีย์เพียงแค่ลบหนึ่งระดับต้นไม้ แต่สร้างดัชนี 1024 หลัก ข้อความค้นหาจะไม่ทราบความแตกต่าง เวลาในการค้นหาอาจมีค่าน้อยที่สุดเมื่อเทียบกับพาร์ติชัน อย่างไรก็ตามตรวจสอบให้แน่ใจว่าข้อมูลทั้งหมดทำงานอยู่ Otheriwse, คุณอาจจะกดปุ่มเพียงไม่กี่พาร์ทิชันในขณะที่พาร์ติชั่นอื่น ๆ ที่มีข้อมูลที่ไม่ค่อยเข้าถึงได้เพียงแค่ใช้พื้นที่และจะไม่เข้าถึงบ่อยพอที่จะปรับแบ่งพาร์ทิชัน คุณอาจมีตัวชี้วัดประสิทธิภาพที่แตกต่างกันเพื่อกังวลเกี่ยวกับสิ่งที่เห็นได้ชัดกว่า (เช่นการจัดเรียงข้อมูลภายในใน XFS , ext3 vs ext4 เป็นต้น) คุณต้องกังวลเกี่ยวกับเอ็นจิ้นการจัดเก็บข้อมูลที่คุณใช้เพราะ:

  • การจัดทำดัชนี InnoDB นั้นจะมีความยุ่งเหยิงเล็กน้อยเมื่อเทียบกับ MyISAM เพราะต้องจัดการดัชนีแบบกลุ่ม
  • InnoDB ทำการเขียนข้อมูลสองครั้งใน ibdata1 เช่นเดียวกับไฟล์บันทึกปัจจุบัน (ib_logfile0 หรือ ib_logfile1)

1
ขอบคุณ RolandoMySQLDBA นี่น่าสนใจมาก สิ่งที่ฉันเข้าใจจากเรื่องนี้คือการแบ่งพาร์ติชันจะมีอิทธิพลเชิงบวกเล็กน้อย แต่น่าชื่นชมในความเร็วการสืบค้น แต่อาจมีผลกระทบเชิงลบอื่น ๆ เช่นการแยกส่วน อย่างไรก็ตามสิ่งที่ฉันสนใจคือวิธีกำหนดจำนวนพาร์ติชันที่เหมาะสมที่สุด ฉันควรใช้จำนวนสูงสุดที่อนุญาตเสมอ (เช่น 1024) หรือจำนวนอื่น ๆ อาจเป็นการประนีประนอมที่ดีระหว่างผลบวกและลบ? หรือไม่สามารถวิเคราะห์การเพิ่มประสิทธิภาพประเภทนี้ได้?
robguinness

BTW บทความนี้แสดงให้เห็นว่าคำตอบนั้นซับซ้อนกว่าเล็กน้อย: mysqlperformanceblog.com/2010/12/11/…
robguinness

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