Optimizing ActiveRecords ที่ติดต่อกับ MySQL ด้วยการใช้ query ที่ง่ายขึ้น


Ruby on Rails (RoR) เป็น full-stack MVC framework หมายความว่ามีครบทุกส่วนสำหรับการจะสร้าง web application สักตัวหนึ่งแบบ MVC (Model-View-Controller)

ในส่วน Model ของ RoR คือ ActiveRecords ซึ่งจะ encapsulate เจ้า RDBMS (Relational Database Management System สักตัวให้เป็น ORDBMS (Object Relational Database Management System)

การใช้งาน ActiveRecords นี่ก็มี tricks มากมายน่าดูเหมือนกัน

ที่มาของ tricks โดยส่วนใหญ่เกิดขึ้นเพราะการทำงานของ ActiveRecords จะเร็วหรือช้าขึ้นอยู่กับ RDBMS ที่อยู่ข้างหลัง

trick ที่ผมใช้ในวันสองวันนี้แล้วทำให้ GotoKnow เร็วขึ้นเยอะคือการทำ "ตรงข้าม" กับคำแนะนำในการใช้ ActiveRecords ครับ

โดยปกติแล้ว เพื่อการ access เร็ว เขาจะแนะนำกันว่า ให้พยายามทำ query ให้เหลือแต่น้อย นั่นคือ query เดียวให้ได้ has_one และ has_many objects มาให้หมดเลย สำหรับ ActiveRecords ก็คือการเพิ่ม :include parameter เข้าไป อาทิเช่น

p = Planet.find(:first, :conditions => ["address => 'howto'"], :include => [:user, :taggings])

ซึ่งเราจะได้ planet มาพร้อมกับ user เจ้าของเรียบร้อยภายใน query เดียว ประหยัด socket และ waiting time ระหว่างเครื่องแม่ข่าย

แต่ MySQL มีข้อเด่นตรงที่ execute simple queries ได้เร็ว และ execute complex queries ได้ช้า (บางคนว่าช้าขึ้นแบบ exponential ทีเดียว)

ดังนั้น การหาด้วย

p = Planet.find(:first, :conditions => ["address => 'howto'"])

แล้วค่อยหา user โดยการ access ด้วย p.user ซึ่งจะทำให้เกิดการ access database ไปอีกหนึ่ง query กลับทำงานได้เร็วกว่า

เรื่องนี้สอนให้รู้ว่า ใช้ ActiveRecords ต้องคำนึงถึง RDBMS ที่อยู่ข้างหลังด้วย หากเป็น RDBMS ตัวอื่น ผลลัพธ์อาจเป็นตรงข้ามก็ได้ครับ

หมายเหตุ ถ้าจะหาเพียง planet เดียวดังตัวอย่างที่ผมยกมา ใช้คำสั่งดังต่อไปนี้จะง่ายกว่าครับ

p = Planet.find_by_address('howto')
คำสำคัญ (Tags): #activerecords#mysql#ruby on rails
หมายเลขบันทึก: 100786เขียนเมื่อ 4 มิถุนายน 2007 22:00 น. ()แก้ไขเมื่อ 19 เมษายน 2012 16:21 น. ()สัญญาอนุญาต: จำนวนที่อ่านจำนวนที่อ่าน:


ความเห็น (5)
ผมอ่านแล้วต้องแบบ bookmark ไว้ด้วย เผื่อจะได้เขียนอะไรที่คนใช้เยอะๆมั่ง :-)

ขอขอบคุณอาจารย์ธวัชชัย...

  • ก่อนอื่นเชียร์ไว้ก่อน ทั้งๆ ที่เรื่องลึกซึ้งแบบนี้อ่านแล้วไม่เข้าใจ
  • ตรงที่อ่านเข้าใจคือ คำว่า "เร็ว" กับ "ช้า"

เรื่องข้อคิดเห็นแบบ pop-up หรือ "โผล่ขึ้นมา"

  • เรียนเสนอให้ใช้แบบ "ไม่โผล่" ครับ
  • อินเตอร์เน็ตเต่า (Intertle = internet + turtle) ที่ลำปางนี่... กว่าจะโผล่นานทีเดียว

ได้ยินจากพวก กฟผ. บอกว่า สายใยนำแสงของการไฟฟ้าฯ มีตามแนวสายส่งไฟแรงสูงอยู่แล้ว

  • ถ้ารัฐบาลตั้งบริษัทบริการอินเตอร์เน็ตใหม่ ใช้สายส่งนี้ น่าจะทำให้อินเตอร์เน็ตไทยเร็วขึ้น
  • ว่าแต่ว่า ขอให้แยกบริษัทฯ เพราะข่าวว่า โบนัสการไฟฟ้าฯ ตกปีละ 3.5 เดือนแล้ว ดีกว่าพวกอาจารย์มหาวิทยาลัยแยะ
ดีค่ะ อ่านแล้วพอให้เข้าใจระบบการทำงานของ G2K ขึ้นบาง จะคอยตามอ่านเรื่อยๆค่ะ เห็นใจเรื่อง spambots ที่ทำให้เปลือง resource แล้วก็เห็นใจคนเน็ตช้าด้วยค่ะ แต่การแก้ปัญหาก็คงมีผลกระทบกับบางคนบางเพื่อให้ได้สิ่งที่ดีขึ้น

โอ้โห... การไฟฟ้าฯ โบนัส 3.5 เดือนเลยหรือครับ เรื่องนี้คนไทยคงไม่มีโอกาสได้รู้กันเท่าไหร่ ที่จริงแล้วถ้าการไฟฟ้าฯ เป็นบริษัทจดทะเบียนในตลาดหลักทรัพย์ก็ดีเหมือนกัน เพราะข้อมูลอย่างนี้จะต้องเปิดเผยและจะมีนักการเงินมาช่วยวิเคราะห์กันเยอะเลย

ขอบคถณ ดร.ธวัชชัย ครับ มาแชร์ประสบการณ์เรื่อง RoR  ซึ่งเมืองไทยยังใหม่อยู่มากๆ  มีลูกค้ามาหาผมสองสามราย ถามหาเซอร์ฟเวอร์ที่รัน RoR ผมเองยังไม่รู้จักเลยครับตอนนั้น  จนตอนนี้ก็ยังไม่ได้ศึกษาเต็มๆ เท่าที่ควร  

 ถ้ามันดีอย่างนี้  จะกลับไปศึกษาเพิ่มล่ะครับ

-- หากมีเวลา แวะมาให้คำวิจารณ์ มาตรฐานระบบธุรกิจแฟรนไชส์ตัวใหม่ของไทย ที่ลิงค์นี้นะครับ

พบปัญหาการใช้งานกรุณาแจ้ง LINE ID @gotoknow
ClassStart
ระบบจัดการการเรียนการสอนผ่านอินเทอร์เน็ต
ทั้งเว็บทั้งแอปใช้งานฟรี
ClassStart Books
โครงการหนังสือจากคลาสสตาร์ท