สมัครสมาชิก   เข้าระบบ  
MemeCoder
ธวัชชัย ปิยะวัฒน์
P ธวัชชัย ปิยะวัฒน์
มหาวิทยาลัยสงขลานครินทร์
อีเมลติดต่อ
 
อ่าน: 830
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')
สร้าง: จ. 04 มิ.ย. 2550 @ 22:00   แก้ไข: พฤ. 15 พ.ย. 2550 @ 14:07   ขนาด: 3503 ไบต์
ความคิดเห็น
P
1. वीर
เมื่อ อ. 05 มิ.ย. 2550 @ 00:36
282721 [ลบ]

ผมอ่านแล้วต้องแบบ bookmark ไว้ด้วย เผื่อจะได้เขียนอะไรที่คนใช้เยอะๆมั่ง :-)
P
2. นพ. วัลลภ พรเรืองวงศ์
เมื่อ อ. 05 มิ.ย. 2550 @ 14:22
283099 [ลบ]

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

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

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

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

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

  • ถ้ารัฐบาลตั้งบริษัทบริการอินเตอร์เน็ตใหม่ ใช้สายส่งนี้ น่าจะทำให้อินเตอร์เน็ตไทยเร็วขึ้น
  • ว่าแต่ว่า ขอให้แยกบริษัทฯ เพราะข่าวว่า โบนัสการไฟฟ้าฯ ตกปีละ 3.5 เดือนแล้ว ดีกว่าพวกอาจารย์มหาวิทยาลัยแยะ
P
3. Little Jazz
เมื่อ อา. 10 มิ.ย. 2550 @ 15:23
287995 [ลบ]

ดีค่ะ อ่านแล้วพอให้เข้าใจระบบการทำงานของ G2K ขึ้นบาง จะคอยตามอ่านเรื่อยๆค่ะ เห็นใจเรื่อง spambots ที่ทำให้เปลือง resource แล้วก็เห็นใจคนเน็ตช้าด้วยค่ะ แต่การแก้ปัญหาก็คงมีผลกระทบกับบางคนบางเพื่อให้ได้สิ่งที่ดีขึ้น
P
4. ธวัชชัย ปิยะวัฒน์
เมื่อ อา. 10 มิ.ย. 2550 @ 16:02
288038 [ลบ]

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

P
5. กุนซือรับจ้าง
เมื่อ พฤ. 05 ก.ค. 2550 @ 23:31
312607 [ลบ]

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

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

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

ชื่อ:
อีเมล:
IP แอดเดรส: 38.103.63.56
  เรียกใช้งานตัวจัดการข้อความ
ข้อความ:
 
รหัสสุ่ม: (ใส่รหัสสุ่มที่แสดงไว้ด้านบน)
  ยกเลิก
บันทึกอื่นๆ