การเร่งความเร็วของ LEFT JOIN และ ลำดับของฟิลด์ที่ใช้เป็น Index
SELECT C.`id`,C.`contract_no`,C.`bank_id`,P.`id_card`,N.`name`,D.`phone`,L.`court_id`,L.`black_case`,L.`red_case`
FROM `follow_gcms`.`tbl_contract` AS C
INNER JOIN `follow_gcms`.`tbl_person_name` AS N ON N.`contract_id` = C.`id` AND N.`customer_id` = C.`customer_id`
INNER JOIN `follow_gcms`.`tbl_person` AS P ON P.`id` = N.`person_id` AND P.`customer_id` = C.`customer_id`
LEFT JOIN `follow_gcms`.`tbl_person_address` AS D ON D.`name_id` = N.`id` AND N.`customer_id` = C.`customer_id`
LEFT JOIN `follow_gcms`.`tbl_lawsuit` AS L ON L.`id` = C.`lawsuit_id` AND L.`customer_id` = C.`customer_id`
WHERE C.`customer_id` = 1
จากการรัน Query ด้านบน ด้วยข้อมูลหลักประมาณสองพันกว่ารายการ (ไม่นับข้อมูลตารางอื่นๆอีกหลายตาราง) ซึ่งผลลัพท์การ Query ที่ได้ช้ามากๆ ทั้งๆที่เบื่องต้นได้มีการทำ Index แล้วในทุกตาราง ซึ่งโดยหลักการก็พอเข้าใจได้ เนื่องจากมีการใช้ LEFT JOIN ใน Query ซึ่งคำสั่งนี้จะให้ผลลัพท์ที่ช้ากว่า INNER JOIN อยู่แล้ว (ในเคสนี้ไม่สามารถใช้ INNER JOIN ได้ เนื่องจากข้อมูลในตารางนั้นๆอาจมีหรือไม่ก็ได้)
ผมเลยทดสอบด้วยการ Explain Query ได้ผลลัพท์ดังรูปด้านล่าง
ขั้นตอนต่อมาผมไปสำรวจ Index ของตาราง D แสดงว่ามีการกำหนด Index ไว้แล้วอย่างแน่นอน ดังรูปด้านล่าง
เมื่อได้ข้อสรุปของปัญหามาแล้ว ก็ถึงเวลาแก้ปัญหา หลักการก็คือมีการจัดลำดับของ Index ผิด ทำให้การ Query ไม่สามารถใช้ Index ได้เต็มที่ การแก้ไขคือต้องจัดลำดับ Index ให้เอา name_id ขึ้นก่อน customer_id
สรุป
ถึงแม้ Index จะทำให้การ Query ได้เร็วขึ้น แต่ลำดับ Index ก็มีความสำคัญ เนื่องจากลำดับของ Index ที่สอดคล้องกับ Query ที่ต้องการจะทำให้เกิดการใช้ Index ได้อย่างมีประสิทธิภาพ ดังนั้นในการสร้าง Index ให้พิจารณาเงื่อนไขการ Query ข้อมูลประกอบด้วย