GORAGOD.com

เทคนิคการนับจำนวนข้อมูลด้วย SQL

ปกติแล้วการนับจำนวนข้อมูลเรามักจะเขียน SQL กันแบบนี้ (ก็ตำรามักจะสอนกันมาแบบนี้)
SELECT S.`id`,S.`school_id`S.`year`,
(
  SELECT COUNT(*)
  FROM `supervisor_detail`
  WHERE `supervisor_id` = S.`id`
) AS`trainee`
FROM `supervisor` AS S

ซึ่งก็ไม่ผิดนะครับ ผลลัพท์ที่ได้ไม่มีปัญหาแต่อย่างใด ลองมาดูกันว่าผลของคำสั่งข้างต้น MySQL ประมวลผลอย่างไร อธิบายขั้นตอนที่ MySQL ทำ
  1. MySQL จะวนลูปข้อมูลที่ละรายการ (ถ้ามี WHERE ก็จะไปเลือกข้อมูลตาม WHERE)
  2. ที่แต่ละแถว MySQL จะทำการเลือกผลลัพท์ตามคอลัมน์ที่กำหนดใน SELECT ซึ่งในแต่ละรอบ จะทำการคำนวณคำสั่งใน SUQUERY ครั้งละ id ในแต่ละแถว (ตามคำสั่ง WHERE ใน SUQUERY) เพื่อนับจำนวน (COUNT) ทีละรายการ
จะเห็นว่าจะเกิดการ Query ในทุกรอบที่ต้องการผลลัพท์ (ถ้ามีผลลัพท์ 10 แถว จะเกิด Query รวม 11 ครั้ง คือ Query หลัก + Query ตามจำนวนผลลัพท์) ซึ่งตามตารางด้านบนคือ DEPENDENT SUBQUERY นั่นเอง

แน่นอนว่าถ้าข้อมูลที่ต้องการยิ่งเยอะ SUBQUERY ก็จะยิ่งทำให้การ Query ได้ช้าลง ซึ่งเราสามารถปรับปรุงการ Query นี้ได้
SELECT S.`id`,S.`school_id`,S.`year`,COUNT(T.`id`) AS `trainee` 
FROM `supervisor` AS S 
LEFT JOIN `supervisor_detail` AS T ON T.`supervisor_id` = S.`id`
GROUP BY S.`id`

MySQL จะประมวลผลคำสั่งด้านบนดังตารางด้านล่าง อธิบายขั้นตอนที่ MySQL ทำ
  1. MySQL จะทำการจับคู่ข้อมูลแต่ละแถว ของตาราง T กับ ข้อมูลในตาราง S
  2. ถ้ามี WHERE MySQL จะทำคำสั่ง WHERE ในขั้นตอนถัดมา
  3. MySQL จัดกลุ่มข้อมูล เพื่อทำการนับ ตามคำสั่ง COUNT และส่งข้อมูลกลับ
จะเห็นว่า มีการ Query ข้อมูลแค่ 2 ถึง 3 รอบเท่านั้น (คือในตอนที่ JOIN และ ตอนที่ใช้คำสั่ง WHERE และตอนที่ทำ GROUP BY) 
ข้อสังเกตุ ในแบบแรก ถึงจะมีโอกาสเกิด Query ได้จำนวนครั้งมากกว่า แต่ถ้าผลลัพท์ที่ต้องการมีจำนวนแถวน้อย (เช่นต้องการข้อมูลเพียง 1 แถว) การ Query แบบแรกจะเร็วกว่า เนื่องจากในวิธีที่สองการ Join จะดำเนินการกับข้อมูลทั้งหมดก่อน ถึงจะมาทำการเลือกผลลัพท์ที่ต้องการในขั้นตอนสุดท้าย