เพิ่มความเร็วในการแทรก MySQL ด้วยพาร์ทิชันบน MyISAM ด้วยคีย์เฉพาะ


9

ฉันมีตาราง MyISAM ขนาดใหญ่ (~ 30M แถว) ในบางจุดฉันได้เปลี่ยนเป็นรูปแบบแถวคงที่ดังนั้นตอนนี้ตารางจะใช้เวลา ~ 40Gb บนดิสก์และ 2Gb สำหรับดัชนี ตารางมีดัชนีที่ไม่ซ้ำกันและมี 100 'การค้นหาคีย์ซ้ำที่ซ้ำกัน' ต่อวินาที เมื่อตารางเติบโตขึ้นเม็ดมีดเหล่านี้ก็จะช้าลงเรื่อย ๆ

ฉันไม่แน่ใจ แต่พาร์ทิชันจะช่วยฉันเพิ่มความเร็วในการแทรกหรือไม่

คำตอบ:


1

ประการแรกการเขียนพร้อมกันไม่ใช่ตัวเลือกสำหรับการจัดเก็บ MyISAM แต่ละคนจะล็อคตารางทั้งหมด (ยกเว้นการอ่านในบางกรณี) หาก InnoDB ไม่เหมาะกับคุณลอง TokuDB แต่มันจะช้ากว่าเมื่อเปรียบเทียบกับ MyISAM เนื่องจากลักษณะการทำธุรกรรมของเครื่องยนต์ TokuDB (และ InnoDB ของหลักสูตร) ​​(คุณควรเขียนข้อมูลเดียวกันอย่างน้อยสองครั้ง: ไฟล์เจอร์นัลและไฟล์ข้อมูล) นอกจากนี้หากเซิร์ฟเวอร์ของคุณเกิดข้อผิดพลาดบางวันคุณจะต้องรอเป็นชั่วโมงจนกว่าตาราง MyISAM ของคุณจะทำการซ่อมแซม 40Gb

หากคุณยังต้องการโหลดข้อมูลลงในตาราง MyISAM ของคุณและต้องการทำมันอย่างรวดเร็วฉันสามารถแนะนำให้ใช้LOAD DATA INFILEแทนการแทรก นี่เป็นวิธีที่เร็วที่สุดในการโหลดข้อมูลจำนวนมากลงในตาราง และใช่ดัชนีจะลดประสิทธิภาพการแทรกในลักษณะเลขชี้กำลัง

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


อีกหนึ่งเครื่องยนต์ที่น่าสนใจ: code.facebook.com/posts/190251048047090/…
GreyWolf

0

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


เม็ดมีดเหล่านี้เกิดขึ้นพร้อมกัน แต่ InnoDB ช้าเกินไปที่ 'แทรกการอัปเดตคีย์ซ้ำ' ดังนั้นจึงไม่ใช่ตัวเลือก เท่าที่ฉันสามารถบอกได้ว่า IO ไม่ใช่คอขวด - ขนาดของ RAM >> ขนาดของตารางรวมถึงดัชนีและ writecaching เปิดอยู่ ฉันคิดว่าปัญหาอยู่ที่ใดที่หนึ่งในล็อคของ mysql ภายในหรือบางสิ่งบางอย่าง
d0rc

INSERT DELAYED ควรใช้สำหรับคำสั่ง INSERT ที่ระบุรายการค่าเท่านั้น เซิร์ฟเวอร์เพิกเฉย DELAYED สำหรับ INSERT ... SELECT หรือ INSERT ... ในคำสั่ง DUPLICATE KEY UPDATE
llazzaro

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