หลักการที่สำคัญของการจัดลำดับความสำคัญของ 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 ล่ม