2/17/2556

แก้ปัญหา MySQL Table Lock ในตารางที่มีการ Update บ่อยๆ

ยังคงพบเห็นปัญหาการใช้งาน MySQL ได้บ่อยๆ โดยเฉพาะเมื่อมีการนำใไปใช้ในเว็บไซท์ที่มีการใช้งานหนักๆ การออกแบบระบบเดิมไม่สามารถทำได้อย่างที่เคย โดยเฉพาะตัวเว็บบอร์ดทั้งหลาย

เร็วๆ นี้ก็พบการสอบถามเรื่องนี้กับปัญหาเจ้าตัว SMF มีอาการ Table Lock ซึ่งทำให้เว็บไซท์เข้าใช้งานได้ช้ามาก


ภาพตัวอย่างอาการ Table Lock ใน SMF

โดยปกติเว็บไซท์ส่วนใหญ่จะใช้ฐานข้อมูล MySQL โดยใช้ MyISAM Engine เนื่องจากความเร็วในการอ่านข้อมูล แต่เมื่อฐานข้อมูลมีปริมาณเรียกอ่านข้อมูลถี่มากขึ้น การแก้ไขข้อมูลก็จะทำให้เเกิดอาการ Table Lock มากขึ้นด้วย

ใน Table Level-Locking Engine ไม่ว่าจะเป็น MyISAM, MEMORY, MERGE นั้นทุกครั้งที่มีการแก้ไขข้อมูลในตารางจะทำการ Lock Table นั้นๆ ไม่ให้มีการอ่านข้อมูล จนกว่าการแก้ไขข้อมูลเหล่านั้นเสร็จเรียบร้อย ในตารางที่มีปริมาณเรียกอ่านข้อมูลถี่มากๆนั้น แค่เพียงคำสั่งแก้ไขเพียงคำสั่งเดียวก็ทำให้ session ที่เรียกอ่านข้อมูลอื่นๆ ต้องรอจนกว่าจะเสร็จสิ้นคำสั่งแก้ไข

ปัญหา Table Lock นั้นสามารถแก้ไขเบื้องต้นได้โดยการใช้ LOW_PRIORITY UPDATE และ DELAYED INSERT จาอภาพตัวอย่างจะเห็นว่าใน SMF มีการใส่คำสั่งเบื้องต้นเหล่านี้ไว้แล้วแต่ก็ไม่สามารถช่วยได้

ปัญหานี้วิธีแก้ที่ทำให้ปัญหานี้หายไปได้คือแก้ไขที่ตัว Storage Engine นั้นคือเปลี่ยนเป็น Row-Level Locking นั่นคือ INNODB นั่นเอง

ใน INNODB จะมีการทำงานในแบบ Row-Level Locking เมื่อมีการแก้ไขข้อมูลในตารางจะไม่ทำการ Lock ทั้งตารางแต่จะ Lock เพียง Row (ระเบียน) ที่ทำการแก้ไขทำให้ใน Session อื่นๆ ที่ทำงานเรียกอ่านข้อมูลสามารถทำงานได้พร้อมกัน ไม่เกิดอาการค้างเป็นเวลานาน เช่นใน Table-Level Locking Engine แน่นอนว่าได้มาซึ่งประสิทธิภาพที่ดีขึ้นก็ต้องมีสิ่งแลกเปลี่ยนเนื่องจาก INNODB ต้องการหน่วยความจำมากกว่า MyISAM ในการใช้งาน และจะมีประสิทธิภาพสูงสูดเมื่อจัดสรรค์ หน่วยความจำให้เพียงพอกับขนาดของ INDEX ต่างๆ

0 ความคิดเห็น:

แสดงความคิดเห็น