เมื่อคุณใช้ORDER BY
อนุประโยคภายในแบบสอบถามย่อยที่ใช้ร่วมกับUNION
mysql จะทำให้ORDER BY
อนุประโยคนั้นเหมาะสมที่สุด
เนื่องจากโดยค่าเริ่มต้นUNION
จะส่งคืนรายการที่ไม่เรียงลำดับดังนั้นจึงORDER BY
ไม่ต้องทำอะไรเลย
การเพิ่มประสิทธิภาพถูกกล่าวถึงในเอกสารและกล่าวว่า:
ในการนำ ORDER BY หรือ LIMIT ไปใช้กับแต่ละ SELECT ให้วางส่วนคำสั่งไว้ในวงเล็บที่ล้อมรอบ SELECT:
(SELECT a FROM t1 WHERE a=10 AND B=1 ORDER BY a LIMIT 10) UNION
(SELECT a FROM t2 WHERE a=11 AND B=2 ORDER BY a LIMIT 10);
อย่างไรก็ตามการใช้ ORDER BY สำหรับคำสั่ง SELECT แต่ละคำไม่ได้หมายความว่าไม่มีอะไรเกี่ยวกับลำดับที่แถวปรากฏในผลลัพธ์สุดท้ายเนื่องจาก UNION โดยค่าเริ่มต้นจะสร้างชุดแถวที่ไม่เรียงลำดับ ดังนั้นโดยทั่วไปการใช้ ORDER BY ในบริบทนี้จะใช้ร่วมกับ LIMIT เพื่อที่จะใช้เพื่อกำหนดส่วนย่อยของแถวที่เลือกเพื่อดึงข้อมูลสำหรับ SELECT แม้ว่าจะไม่จำเป็นต้องมีผลต่อลำดับของแถวเหล่านั้นใน ผลลัพธ์สุดท้ายของ UNION หาก ORDER BY ปรากฏโดยไม่มี LIMIT ใน SELECT ระบบจะปรับให้เหมาะสมที่สุดเพราะจะไม่มีผลใด ๆ
ประโยคสุดท้ายนี้ทำให้เข้าใจผิดเล็กน้อยเพราะมันน่าจะมีผล การเพิ่มประสิทธิภาพนี้ทำให้เกิดปัญหาเมื่อคุณอยู่ในสถานการณ์ที่คุณต้องสั่งซื้อภายในแบบสอบถามย่อย
ในการบังคับให้ MySQL ไม่ทำการเพิ่มประสิทธิภาพนี้คุณสามารถเพิ่ม LIMIT clause ดังนี้:
(SELECT 1 AS rank, id, add_date FROM my_table WHERE distance < 5 ORDER BY add_date LIMIT 9999999999)
UNION ALL
(SELECT 2 AS rank, id, add_date FROM my_table WHERE distance BETWEEN 5 AND 15 ORDER BY rank LIMIT 9999999999)
UNION ALL
(SELECT 3 AS rank, id, add_date from my_table WHERE distance BETWEEN 5 and 15 ORDER BY id LIMIT 9999999999)
ค่าสูงLIMIT
หมายความว่าคุณสามารถเพิ่มOFFSET
ข้อความค้นหาโดยรวมได้หากคุณต้องการทำบางอย่างเช่นการแบ่งหน้า
นอกจากนี้ยังช่วยให้คุณได้รับประโยชน์เพิ่มเติมจากความสามารถในORDER BY
คอลัมน์ต่างๆสำหรับแต่ละสหภาพ