เทคนิคการนับจำนวนข้อมูลด้วย SQL
ปกติแล้วการนับจำนวนข้อมูลเรามักจะเขียน SQL กันแบบนี้ (ก็ตำรามักจะสอนกันมาแบบนี้)
ซึ่งก็ไม่ผิดนะครับ ผลลัพท์ที่ได้ไม่มีปัญหาแต่อย่างใด ลองมาดูกันว่าผลของคำสั่งข้างต้น MySQL ประมวลผลอย่างไร อธิบายขั้นตอนที่ MySQL ทำ
แน่นอนว่าถ้าข้อมูลที่ต้องการยิ่งเยอะ SUBQUERY ก็จะยิ่งทำให้การ Query ได้ช้าลง ซึ่งเราสามารถปรับปรุงการ Query นี้ได้
MySQL จะประมวลผลคำสั่งด้านบนดังตารางด้านล่าง อธิบายขั้นตอนที่ MySQL ทำ
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 ทำ
- MySQL จะวนลูปข้อมูลที่ละรายการ (ถ้ามี WHERE ก็จะไปเลือกข้อมูลตาม WHERE)
- ที่แต่ละแถว MySQL จะทำการเลือกผลลัพท์ตามคอลัมน์ที่กำหนดใน SELECT ซึ่งในแต่ละรอบ จะทำการคำนวณคำสั่งใน SUQUERY ครั้งละ id ในแต่ละแถว (ตามคำสั่ง WHERE ใน SUQUERY) เพื่อนับจำนวน (COUNT) ทีละรายการ
แน่นอนว่าถ้าข้อมูลที่ต้องการยิ่งเยอะ 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 ทำ
- MySQL จะทำการจับคู่ข้อมูลแต่ละแถว ของตาราง T กับ ข้อมูลในตาราง S
- ถ้ามี WHERE MySQL จะทำคำสั่ง WHERE ในขั้นตอนถัดมา
- MySQL จัดกลุ่มข้อมูล เพื่อทำการนับ ตามคำสั่ง COUNT และส่งข้อมูลกลับ
ข้อสังเกตุ ในแบบแรก ถึงจะมีโอกาสเกิด Query ได้จำนวนครั้งมากกว่า แต่ถ้าผลลัพท์ที่ต้องการมีจำนวนแถวน้อย (เช่นต้องการข้อมูลเพียง 1 แถว) การ Query แบบแรกจะเร็วกว่า เนื่องจากในวิธีที่สองการ Join จะดำเนินการกับข้อมูลทั้งหมดก่อน ถึงจะมาทำการเลือกผลลัพท์ที่ต้องการในขั้นตอนสุดท้าย