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

Written on May 15, 2008 – 12:15 pm | by admin |

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

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

ก็เขียนแบบ 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 รับไม่ไหว” เหอๆๆๆ

  1. 4 Responses to “ผลของการ Join Table แบบเห็นๆ”

  2. By few on May 15, 2008 | Reply

    เมื่อก่อน ตอนผมเขียนไม่เป็น ผมก็ select ซ้่อน select นะครับ แต่หลังจากเรียน ถูกปั่นหัวแบบที่พี่ว่าแหละ สั้น ง่าย แล้วตอนเขียนทดสอบก็ไม่เห้นผลอะไร แต่ทำให้เขียนเร็วขึ้น

    แต่พอมาทำงานเจอ database แค่ 20000 record แล้วมีการ join สัก 3-4 table เล่นอืดไปเลย ตอนแรกก็เล็งแล้วแล้วหละครับว่าเป้นที่ join แต่ก็ไม่มั่นใจ ฮ่าๆ เจอพี่เขียนแบบนี้ เดี๋ยวต้องกลับไปโละทดสอบอีกที :D

    ขอบคุณครับ

  3. By admin on May 15, 2008 | Reply

    เหอๆๆ
    20,000 record มันน้อยไปครับ
    เพราะผมทำกะเว็บ mocyc คิวรี่ที 3 แสน record ครับ

    และนายเปิ้ลก็คิวรี่ฐานข้อมูล มช. ทีละเป็นล้าน record ครับ
    เลยรู้ถึงปัญหาพวกนี้

    หากเว็บเล็กๆ ทำง่ายๆก็ JOIN ไปเหอะ
    แต่ทำระบบใหญ่ๆขึ้นมาแล้วจะรู้ทันทีว่า ทฤษฏีบางอย่าง มันสมควรใช้กับงานบางอย่างเท่านั้น

  4. By BillDesign on May 18, 2008 | Reply

    เท่าที่เห็นๆมา ส่วนใหญ่เขาก็ใช้แต่ Select ซ้อนกัน ซ่ะเป็นส่วนใหญ่ ผมเองมาใช้ Join ก็ตอนทำโปรเจคส่ง อ.นี่แหละครับ แต่เว็บพวกนั้นเล็กๆ ไม่น่าจะมีปัญหาอะไร

    เมื่อไหร่เว็บเราจะมี Database ระดับแสน record อย่างเว็บ Mocyc บ้างหน่า

  5. By rawee on May 23, 2008 | Reply

    รู้สึกเป็นเกียรติอย่างยิ่งที่ใช้ join ไม่เป็น

You must be logged in to post a comment.

Editor's Talk!

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

นายแม็ค

ค้นหา :