ผลของการ Join Table แบบเห็นๆ

Thursday, May 15th, 2008

หลายๆคนชอบถามผมว่าทำไมผมเขียนโค๊ดผมไม่ชอบเขียนโค๊ดติดต่อดาต้าเบส แบบเทพๆ ผมก็มาคิดในใจ

เทพยังไงว่ะ!!!

ก็เขียนแบบ JOIN TABLE อะไรแบบนี้ ทำไมผมต้องมาเขียน Select ตั้ง 2 รอบ อะไรแบบนี้ มีคนถามผมว่าทำไมผมไม่เขียนแบบนี้

$result = mysql_query(”SELECT * FROM orders_to_item  LEFT JOIN items ON orders_to_item.item_id=items.item_id WHERE orders_to_item.order_id = ‘”.$_GET[’order_id’].”‘ “);

พี่เขียนไม่เป็นใช่ม๊า ???? (มีคนถามผม)

ไอ้เขียนหน่ะเขียนเป็น แต่ไม่ใช้ (กรูไม่ใช้ใครจะทำไม)

แต่ที่ไม่ใช้มันก็มีเหตุผลของมัน อาจจะเพราะว่าผมไม่ได้เดินมากะสายคอมโดยตรง ที่นั่งเรียนทฤษฏีดาต้าเบส จากรั้วมหาวิทยาลัย ที่วันๆอาจารย์ก็สอนเรื่องเดิมๆก็พวกการออกแบบดาต้าเบส การติดต่อดาต้าเบส การ JOIN TABLE อะไรพวกนี้ ซึ่งจะว่ากันจริงๆ

อาจารย์ส่วนมากไม่ได้มาจับกับ Database ใหญ่ๆกันหรอก โดยมากก็สอนให้รู้ถึงทฤษฏี และ บอกข้อดีก็เท่านั้น ซึ่งคนที่เรียนๆมาก็คงได้ยินอาจารย์พูดว่า

“การ JOIN ทำให้เราเขียนโค๊ดคิวรี่ข้อมูลได้สั้นขึ้น ไวขึ้น ง่ายขึ้น”

ก็ถูกอย่างที่อาจารย์พูดนะ เขียนโค๊ดสั้นๆ ง่ายขึ้น จริงๆว่ะ

แต่บังเอิญว่าผมเดินมาคนละสายกัน ผมวุ่นกับเรื่องการแก้ไขดาต้าเบสบ่อยมากๆ มากซะจนผมคืดว่าการเอาข้อมูลมาแสดงผลจากดาต้าเบสยังไงให้เอามาได้ไวที่สุด และ ส่งผลกระทบกับ Server ให้น้อยที่สุด และผมก็พบทางสว่าง(มานานแล้ว)

หากคนเรียนดาต้าเบสแล้วทำพวก JOIN ไรเก่งๆก็คงได้ A ไปตามๆกัน แต่หากมาทำให้ประสิทธิภาพโดยรวมของระบบนั้นท่านคงได้ C D กันเป็นแถวๆ

ผมเคยทำมาหมดครับพวก JOIN เนี่ย มันเป็นทฤษฏีที่น่าสนใจ แต่ไม่น่านำมาใช้เลยให้ตาย เพราะผมลองจับ Process มาหมดครับ ยังไงการ คิวรี่ข้อมูลสองครั้ง สามครั้ง ก็ไวกว่าการ JOIN TABLE ครับ ยืนยัน และ ฟันธง

อ้างจากคำพูดนายเปิ้ล Apsserv ที่เคยพูดกะผมนานแล้วว่า
“ดาต้าเบสมีไว้เก็บข้อมูล ไม่ได้มีไว้เอามาคำนวน ทำไงก็ได้ให้ดึงออกมาแสดงให้ไวที่สุดก็พอ”

และปัญหาจากเร่องการ JOIN ก็เกิดขึ้น กับ Server จนได้ เมื่อนายเปิ้ลมาคุยกับผมว่า

apples : AppServ 2.6.0 เลือก…สิ่งใหม่…ให้ชีวิตที่ไม่หยุดนิ่ง says:
หิหิ
apples : AppServ 2.6.0 เลือก…สิ่งใหม่…ให้ชีวิตที่ไม่หยุดนิ่ง says:
เจออีกแล้ว
apples : AppServ 2.6.0 เลือก…สิ่งใหม่…ให้ชีวิตที่ไม่หยุดนิ่ง says:
JOIN นรก

ได้เห็นคำพูดก็รู้เลยว่าเรื่องอะไร แล้วก็ดู Stats ของ Server ทันที ผลเป็นแบบนี้

join_table_effect.jpg

พอดีลูกค้าออกแบบระบบเว็บใหม่ นี่คือผลแค่ 1 เว็บเท่านั้นนะ เว็บเขาออกแบบระบบใหม่ให้ JOIN TABLE ผลที่ได้ดูครับ Traffic เท่าเดิม แต่ลองดูที่ CPU LOAD กับ SERVER LOAD ดูสิครับ พุ่งขึ้นทันตา

เห็นไหมหล่ะครับ คำว่าเขียนโค๊ดติดต่อ Database แบบเทพๆ สุดท้ายเมื่อเขียนโค๊ดแบบนี้ ก็ต้องอาศัยของเทพๆอีกเช่นกันก็คือ

Server แบบเทพๆ
ซึ่งก็ต้องแลกมาด้วย ราคาขั้นเทพอีกด้วย 5555

ผมไม่ได้รู้เรื่องสถาปัตยกรรมคอมมากนักหรอก แต่สิ่งที่นายเปิ้ลเคยบอกผมไว้ว่า

“การ Select ในแบบปกติระบบจะทำงานบน เมมโมรี่ แต่หาก JOIN เมื่อไหร่ มันจะไปทำงานบนฮาร์ดดิสก์แทน สมัยก่อนแรมอาจจะน้อยคนเลยหันไปทำงานบนฮาร์ดดิสก์ แต่ปัจจุบัน Server มีแรมในระดับ GB ทั้งนั้น ดังนั้นลองมาคิดดูว่า เมมโมรี่ เทียบกับฮาร์ดดิสก์ที่ทำงานในระดับไม่กี่พัน หรือ หมื่น rpm จะทำงานเร็วได้เท่าเมมโมรี่ได้ เพราะการอ่านบนฮาร์ดดิสก์ ไหนจะอ่านไฟล์เว็บ ไหนจะอ่านนู่นๆนี่ๆอีก”

เว็บ Mocyc.com ผมเมื่อก่อน(5-6 ปีก่อน)คนเข้าน้อยกว่านี้ แต่ทำไม Server แทบรับไม่ได้ พอมาเขียนระบบการใช้งาน Database ใหม่ ตอนนี้คนเข้าเยอะกว่าตอนนั้น 3-4 เท่า แต่ Server ทำงานเบาลงกว่าเดิมมาก

บางครั้งทฤษฏีที่ร่ำเรียนมา มันก็สู้ประสบการณ์ไม่ได้ สู้ๆๆๆ

วันนี้มาเพิ่มซะหน่อย ลองดูผลหลังจากเอา JOIN ออก ดีนะที่เจ้าของเว็บเชื่อ และ แก้ไขโค๊ดให้ โดยเปลี่ยนการคิวรี่ข้อมูล ไม่ใช้ JOIN ผลออกมาแบบนี้ครับ

join_effect.jpg
ดูกราฟเทียบกันสิครับ

หากเป็นเว็บไซต์ใหญ่ๆหล่ะ คนเข้าวันนึงเป็นหลายหมื่น หรือ เป็นแสน ผลกระทบย่อมมากตาม สุดท้ายก็มีแค่คำแก้ตัวคำเดียวว่า “Server รับไม่ไหว” เหอๆๆๆ

Editor's Talk!

สวัสดีคนที่หลงเดินทางเข้ามายัง Blog ของผม อาจจะด้วยความไม่ตั้งใจ หรือ ตั้งใจเข้ามาก็ตาม ก่อนอื่นผมก็ต้องขอออกตัวก่อนว่า Blog ของผมมันจะมีสาระบ้าง หรือ ไม่มีสาระเลย ก็แล้วแต่อารมณ์ช่วงไหนอยากเขียนอะไร อย่าเหมาว่า Blog ผมจะต้องมีแต่ความรู้เหมือน Blog ของคนอื่นๆ นะครับ
สำหรับ Blog นี้ ผมสามารถใช้คำพูดใดๆก็ได้ตามที่ผมเห็นสมควร เพราะมันคือ Blog ของกู(ผม) บางครั้งผมเขียนไปกระทบใครก็ขออภัยไว้ ณ. ที่นี้ด้วย ก็ไม่มีอะไรมากครับ ขอบคุณที่เข้ามาอ่าน Blog ของผมนะครับ

นายแม็ค

ค้นหา :