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&#39

Source : http://gotoknow.org/blog/memecoder/100786