Monday, November 12, 2012

mysql performance tuning แบบลูกทุ่งๆ

ที่ผ่านมาเคยใช้เพียง Oracle กับระบบที่มีปริมาณ data ค่อนข้างมากเท่านั้น ซึ่งปัญหา performance ที่เคยพบนั้นจะมีสาเหตุมาจาก bug ของ database driver ใน Perl หรือ จากการเขียน sql query ที่มีประสิทธิภาพแย่มากจริงๆไม่ไหวเลยเท่านั้น แต่ยังไม่เคยพบปัญหาอันเกิดจากปริมาณ data ที่ค่อนข้างมากแล้วส่งผลให้ performance แย่ลงโดยตรง

แต่เมื่อเร็วๆนี้ต้องเข้ามาแก้ปัญหา performance ใน MySQL ที่มี data ปริมาณค่อนข้างมาก อาการคือ mysqld จะกินทรัพยากรเครื่องสูงเกินไปในบางช่วงเวลา ซึ่งก็ไม่สามารถระบุได้ว่าสาเหตุเกิดจากอะไร รู้เพียงว่าหากรอสักพักใหญ่ๆ มันจะกลับมาเป็นปกติ ในช่วงเวลาที่ mysqld กินทรัพยากรสูง (high load average) นั้นเอง ทำให้ระบบไม่สามารถทำงานได้

หลังจากพยายามหาวิธีในการ debug หาสาเหตุต้นตอของปัญหานี้ก็ได้พานพบกับวิธีหนึ่งที่รู้สึกว่าน่าจะดี และ น่าจะช่วยแก้ปัญหาได้ตรงจุด

MySQL สามารถ log sql query ที่ทำงานช้าเกินกว่าค่าที่เรากำหนด หรือ sql query ที่ไม่ได้ใช้ index ได้ โดยสามารถ config ได้ใน /etc/mysql/my.cnf

log_slow_queries = /var/log/mysql/mysql-slow.log
long_query_time = 5
log-queries-not-using-indexes

จาก log ที่ได้เราจะรู้ว่า sql query ใดที่ทำงานช้า เราจะได้ optimize มันเสีย ไม่ว่าจะด้วยการทำ index หรือการปรับ query ; )


0 comments:

Post a Comment