การกำหนดลำดับความสำคัญภายในคำสั่ง WHERE ของ MySQL

การกำหนดลำดับความสำคัญภายในคำสั่ง WHERE ของ MySQL มีผลต่อประสิทธิภาพของการ query เป็นอย่างมาก โดยเฉพาะในกรณีที่ ฐานข้อมูลมีขนาดใหญ่ หรือการ query ที่ซับซ้อน โดยที่ MySQL จะประมวลผลคำสั่ง SQL จากซ้ายไปขวา ครับ

หลักการที่สำคัญของการจัดลำดับความสำคัญของ 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 ล่ม
ผู้เขียน goragod โพสต์เมื่อ 28 ก.พ. 2552 เปิดดู 8,369 ป้ายกำกับ SQL
^