GORAGOD.com

เทคนิคการ Join ข้อมูล ตอนที่ 3

เนื่องจากการ JOIN คือการรวมข้อมูลเข้าด้วยกันจากหลายๆตาราง ดังนั้นสิ่งที่เกิดขึ้นและหลีกเลี่ยงไม่ได้ก็คือการเสียเวลาส่วนหนึ่งไปกับการรวมข้อมูลจากหลายๆตารางเข้าด้วยกัน ซึ่งจะเสียเวลามากสุด (หรือมีประสิทธิภาพน้อยลง) เมื่อจำนวนตารางที่นำมา JOIN กันมีหลายตาราง หรือข้อมูลในแต่ละตารางมีจำนวนมากขึ้น ดังนั้นการเลือกวิธีการ JOIN ที่เหมาะสม (การจัดลำดับและรูปแบบการ Query) จะช่วยให้การประมวลผลเร็วขึ้น
SELECT I.item_id,I.detail,G.cat_name FROM items AS I
INNER JOIN categories AS C ON C.item_id=I.item_id
INNER JOIN category AS G ON G.cat_id=C.cat_id
WHERE I.item_id=1

ลองมาดูลำดับขั้นการทำงานของคำสั่งด้านบนกันดู
  1. เลือกตาราง items
  2. จับคู่ตาราง items กับตาราง categories
  3. จับคู่ผลลัพท์ที่ได้กับตาราง category
  4. ทำคำสั่ง WHERE
  5. ทำคำสั่ง SELECT
การรู้ลำดับขั้นการทำงานจะช่วยให้เราทำการเลือกใช้ query ให้เหมาะสม โดยจุดประสงค์ของการรู้ลำดับการทำงานก็เพื่อเลือก query ที่ให้ผลลัพท์น้อยที่สุดมาทำงานก่อน

การ JOIN ที่มีประสิทธิภาพ

1.ใช้คีย์ในการ JOIN เนื่องจากการค้นหาข้อมูลที่เป็น Index จะใช้เวลาน้อยที่สุด ดังนั้นการกำหนดฟิลด์ที่จะนำมา JOIN ให้เป็น Index จะช่วยให้การประมวลผลเร็วขึ้น
INNER JOIN categories AS C ON C.item_id=I.item_id

I.item_id ควรกำหนดเป็น Index
2.หลีกเลี่ยงการ JOIN หากไม่จำเป็น หากผลลัพท์ที่ต้องการจากตารางที่นำมา JOIN เป็นเพียงข้อมูลแค่ ฟิลด์เดียว (การ JOIN สามารถให้ผลลัพท์ได้มากกว่า 1 ฟิล์ด) อาจเลี่ยงไปใช้ Subquery แทน
SELECT I.item_id,I.detail
    ,(SELECT cat_name FROM category WHERE cat_id IN (
        SELECT cat_id FROM categories WHERE item_id=I.item_id
    ) LIMIT 1) AS cat_name
FROM items AS I
WHERE I.item_id=1
  1. เลือกตาราง items
  2. เลือกตาราง categories
  3. เลือกตาราง category ที่ตรงกันกับ categories
  4. ทำคำสั่ง WHERE
  5. ทำคำสั่ง SELECT
วิธีการนี้จะเป็นการจับคู่กันในทุกรายการก่อน แล้วจึงค่อยเลือกรายการที่ต้องการออกมา
SELECT Q.item_id,Q.detail,G.cat_name
FROM (SELECT I.item_id,I.detail FROM items AS I WHERE I.item_id=1) AS Q
INNER JOIN categories AS C ON C.item_id=Q.item_id
INNER JOIN category AS G ON G.cat_id=C.cat_id
  1. เลือกตาราง items จากคำสั่ง FROM
  2. ทำคำสั่ง WHERE
  3. ทำคำสั่ง SELECT ตาราง items
  4. จับคู่ผลลัพท์ กับตาราง categories
  5. จับคู่ผลลัพท์ที่ได้กับตาราง category
  6. ทำคำสั่ง SELECT
จุดเด่นของวิธีนี้คือมีค่า query ในตาราง items ก่อนซึ่งจะทำให้ได้ผลลัพท์เท่าที่ต้องการ หลังจากนั้นจึงค่อยนำเฉพาะผลลัพท์มา JOIN เพื่อหาข้อมูลในส่วนอื่นๆ ซึ่งในการ query ในส่วนของ Subquery จะกระทำกับข้อมูลที่จำนวนน้อยกว่า