การกำหนดลำดับความสำคัญภายในคำสั่ง WHERE ของ MySQL
หลักการที่สำคัญของการจัดลำดับความสำคัญของ query ในส่วนนี้ อยู่ที่การกำหนดให้ผลลัพท์ที่ได้เรียงลำดับจากน้อย ไปหามาก จาก query ด้านซ้าย ไปหา query ด้านขวา
ผมยกตัวอย่างฐานข้อมูล สมาชิก นะครับ
สมมุติมีข้อมูลทั้งหมด 100 record เป็นชาย 50 คน หญิง 50 คน และมีชื่อไม่ซ้ำกัน
ผมต้องการข้อมูลที่เป็น ชาย
SELECT * FROM user WHERE sex='m'
ผมจะได้ข้อมูลทั้งหมด 50 record
หากผมต้องการ ข้อมูลชื่อ test
SELECT * FROM user WHERE username='test'
ผมจะได้ข้อมูลเพียง record เดียว (ถ้ามี)
คำสั่งข้างต้น MySQL จะทำการวน loop ตั้งแต่ record แรกสุดทีละ record และเปรียบเทียบข้อมูลภายในคำสั่ง WHERE ซึ่งแน่นอน มันจะต้องทำการประมวลผลทั้งหมด 100 รอบ ตามจำนวนข้อมูล
สมมุติ หากผมต้องการข้อมูล ชื่อ test ที่เป็น ชาย ผมจะเขียน query ได้ 2 แบบ
SELECT * FROM user WHERE sex='m' AND username='test'
และ
SELECT * FROM user WHERE username='test' AND sex='m'
ถ้าจะดูกันที่ผลลัพท์ ทั้ง 2 คำสั่งคงให้ผลลัพท์เหมือนกันครับ คือ 1 record ในกรณีที่ test เป็น ชาย และ 0 record ในกรณีที่ test เป็น หญิง หรือไม่มี user ชื่อ test
มาตรวจสอบลำดับการทำงานกัน
ในกรณีที่ 1 sex='m' AND username='test' MySQL จะทำการตรวจสอบ sex ว่าเท่ากับ m หรือไม่ก่อน ถ้าพบว่าเป็น m ถึงจะไปตรวจสอบ ว่า username เป็น test หรือไม่ ในกรณีนี้ เท่ากับว่า มีการตรวจสอบในกล่ม sex จำนวน 100 ครั้ง ได้ผลลัพท์ไไปตรวจสอบ ชื่อ จำนวน 50 ครั้ง เท่ากับต้องมีการตรวจสอบรวม 100 + 50 = 150 ครั้ง (ค่านี้เป็นค่าโดยประมาณเพื่อการทำความเข้าใจ)
ในกรณีที่ 2 username='test' AND sex='m' ตามลำดับการตรวจสอบ จะวนลูปตรวจสอบคำสั่งแรกจำนวน 100 รอบเหมือนเดิม แต่จะได้ผลลัพท์ที่เป็นจริง (username='test') เพื่อไปตรวจสอบ sex เพียง record เดียว เท่ากับการประมวลผลเพียง 100 + 1 = 101 ครั้ง
ในการประมวลผลคำสั่งบนตารางเดียวอาจมองไม่ค่อยเห็นภาพเท่าไรนะครับ แต่หากเป็นการตรวจสอบข้ามตารางแล้วละก็จำนวนคำสั่งที่ต้องทำจะทวีคูณเลย เนื่องจาก MySQL จะวนลูปตรวจสอบทีละคำสั่งจนครบทั้งฐานข้อมูล ซึ่งจะทำให้เสียเวลาเพิ่มขึ้นเป็นอย่างมาก
หวังว่าต่อไป คงจะคำนึงถึงลำดับความสำคัญใน query กันนะครับ เพื่อป้องกัน MySQL ล่ม