ขนาดธุรกรรม MySQL มีขนาดใหญ่เกินไป?


23

ฉันมีกระบวนการนำเข้าที่ทำงานบ่อยมากและฉันต้องการให้เป็นข้อตกลง 'all or nothing' หรือ aka: ธุรกรรม

มีหลายด้านและการนำเข้าอาจให้ผลที่ใดก็ได้ระหว่างระเบียน 100k-1mil + นี่เท่ากับเพย์โหลดตั้งแต่หลาย MB ไปจนถึงสองสามร้อย MB ของข้อมูล

ฉันรู้ว่าตารางชั่วคราวเป็นอีกตัวเลือกหนึ่ง - แต่วิธีนี้ดูมีประโยชน์มาก

มีคำเตือนใด ๆ ที่ควรระวังเกี่ยวกับการฝึกฝนประเภทนี้ด้วยการจัดการข้อมูลจำนวนมากระหว่างการกระทำหรือไม่? (ด้านนอกของโหลดการเขียน / การจัดทำดัชนีโดยทั่วไปจะเกิดขึ้นเมื่อมีการยืนยัน)


ส่วนตัวผมชอบที่จะมีความสมดุล ฉันนำเข้าในการทำธุรกรรม 1k หรือ 10k เพราะฉันเพิ่งรู้ว่ามันจะไปแถวประมาณ 900k แล้วก็ผิดพลาดเพราะขนาดบัฟเฟอร์หรือสิ่งอื่นที่ไร้สาระ ค่อนข้างง่ายต่อการรับจากที่และไม่มาก I / O
Captain Hypertext

คำตอบ:


20

สิ่งที่ต้องระวังอย่างหนึ่งคือ InnoDB Log Buffer ขนาดถูกกำหนดโดยinnodb_log_buffer_size นี่คือสิ่งที่เอกสาร MySQL พูดถึง:

ขนาดเป็นไบต์ของบัฟเฟอร์ที่ InnoDB ใช้เพื่อเขียนไปยังไฟล์บันทึกบนดิสก์ ค่าเริ่มต้นคือ 8MB บัฟเฟอร์บันทึกขนาดใหญ่ทำให้ธุรกรรมขนาดใหญ่สามารถรันได้โดยไม่จำเป็นต้องเขียนบันทึกลงดิสก์ก่อนทำรายการ ดังนั้นถ้าคุณมีการทำธุรกรรมขนาดใหญ่ทำให้บัฟเฟอร์การบันทึกที่มีขนาดใหญ่กว่าบันทึก I / O ของดิสก์

ไม่ควรสับสนกับ InnoDB Log Buffer กับ InnoDB Buffer Pool ความแตกต่างที่สำคัญระหว่างพวกเขาคือจุดประสงค์ของพวกเขา โดยทั่วไป InnoDB Log Buffer จะบันทึกการเปลี่ยนแปลงระยะสั้นที่เขียนลงในบันทึกการทำซ้ำ (ib_logfile0, ib_logfile1) InnoDB Buffer Pool (ขนาดโดยinnodb_buffer_pool_size ) แคชข้อมูลและหน้าดัชนีที่จะถูกคอมมิต (หากหน้าสกปรก) และเขียนไปยังดิสก์ในที่สุด หน้าการเปลี่ยนแปลงจะยังคงอยู่ใน RAM จนกว่าจะถูกลบออกผ่านกฎ LRU

ธุรกรรมขนาดใหญ่จะต้องผ่านช่องทางผ่าน Log Buffer ตามที่กล่าวไว้บัฟเฟอร์การบันทึกที่ใหญ่กว่าจะลดขนาดดิสก์ I / O เฉพาะคอมมิชชันขนาดใหญ่เท่านั้นที่จะแสดงคอขวด

คุณอาจต้องการดูตัวเลือก InnoDB อื่น ๆ เพื่อกำหนดค่า

  • innodb_flush_method : นี่กำหนดวิธีการจัดการล้างข้อมูลและอนุญาตให้ระบบปฏิบัติการแคชเขียนไปยัง InnoDB หรือไม่ ( คุณต้องทดลองระหว่าง O_DSYNC และ O_DIRECT )
  • innodb_read_io_threads (ใช้สูงสุด: 64)
  • innodb_write_io_threads (ใช้สูงสุด: 64)
  • innodb_io_capacity (ใช้ค่าที่สูงกว่าเช่น 5,000 หรือ 10,000 แต่ฮาร์ดแวร์จะให้ประโยชน์สูงสุดสำหรับคุณในคำอื่น ๆ ให้ฮาร์ดแวร์ตัดสินความจุ IO เมื่อคุณกำหนดจำนวนมาก)
  • innodb_thread_concurrency : ค่าเริ่มต้นคือ 0 ฉันได้เรียนรู้โดยตรงจาก Ronald Bradford ที่ Percona NYC 2011 เพื่อให้หมายเลขนี้อยู่ที่ 0 ซึ่งช่วยให้ InnoDB ตัดสินใจเลือกจำนวนตั๋วที่ดีที่สุดที่สามารถจัดการได้)

ฉันมีโพสต์อื่น ๆ เกี่ยวกับการเพิ่มประสิทธิภาพ InnoDB สำหรับการวิจัยเพิ่มเติม


อย่างใดฉันรู้ว่าคุณจะอยู่ในนี้ ขอบคุณสำหรับคำตอบที่ละเอียดที่คุณดูเหมือนจะให้เสมอ คำถามด้านข้าง: คุณมีแหล่งข้อมูลเกี่ยวกับการใช้งาน Innodb_io_capacity หรือไม่? เมื่อเอกสารแนะนำให้ผู้บริโภค SATA 5400 / 7200RPM มีค่า 100 กลยุทธ์ของคุณแนะนำให้เพียง 'ลบขีด จำกัด ' โดยการตั้งค่าที่สูงมากหรือไม่?
thinice

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