การใช้ขีดจำกัดใน Mysql: เมื่อเราใช้คำสั่งแบบสอบถาม เรามักจะต้องส่งคืนข้อมูลสองสามแถวแรกหรือแถวกลาง เราควรทำอย่างไรในเวลานี้ ไม่ต้องกังวล mysql ได้จัดเตรียมฟังก์ชันดังกล่าวไว้ให้เราแล้ว
SELECT * จากตาราง LIMIT [offset,] แถว | แถว OFFSET offset
ส่วนคำสั่ง LIMIT สามารถใช้เพื่อบังคับให้คำสั่ง SELECT ส่งคืนระเบียนตามจำนวนที่ระบุ LIMIT ยอมรับหนึ่งหรือสองอาร์กิวเมนต์ตัวเลข พารามิเตอร์ต้องเป็นค่าคงที่จำนวนเต็ม หากกำหนดพารามิเตอร์ไว้สองตัว พารามิเตอร์ตัวแรกจะระบุออฟเซ็ตของแถวเรกคอร์ดที่ส่งคืนแถวแรก และพารามิเตอร์ตัวที่สองจะระบุจำนวนสูงสุดของแถวเรกคอร์ดที่ส่งคืน ออฟเซ็ตของแถวบันทึกเริ่มต้นคือ 0 (แทนที่จะเป็น 1): เพื่อความเข้ากันได้กับ PostgreSQL, MySQL ยังรองรับไวยากรณ์: LIMIT # OFFSET #
mysql> SELECT * FROM table LIMIT 5,10; // ดึงข้อมูลแถวที่ 6-15
//หากต้องการดึงแถวบันทึกทั้งหมดจากออฟเซ็ตหนึ่งไปจนถึงจุดสิ้นสุดของชุดระเบียน คุณสามารถระบุ -1 เป็นพารามิเตอร์ตัวที่สองได้:
mysql> SELECT * จากตารางจำกัด 95,-1; // ดึงข้อมูลแถวที่ 96-สุดท้าย
//หากระบุพารามิเตอร์เพียงตัวเดียว หมายความว่าส่งคืนแถวบันทึกจำนวนสูงสุด:
mysql> SELECT * จากตารางจำกัด 5; //ดึงข้อมูล 5 แถวแรก
//หรืออีกนัยหนึ่ง LIMIT n เทียบเท่ากับ LIMIT 0,n
สังเกตความแตกต่างระหว่างขีดจำกัด 10 และขีดจำกัด 9,1:
ตัวอย่างเช่น:
1.
เลือก * จาก cyclopedia โดยที่ ID>=(
เลือกสูงสุด(ID) จาก (
เลือก ID จาก cyclopedia สั่งซื้อตามขีดจำกัด ID 90001
)เป็นทีเอ็มพี
) จำกัด 100;
2.
เลือก * จาก cyclopedia โดยที่ ID>=(
เลือกสูงสุด(ID) จาก (
เลือก ID จาก cyclopedia สั่งซื้อตามขีดจำกัด ID 90000,1
)เป็นทีเอ็มพี
) จำกัด 100;
ในทำนองเดียวกัน หากเราได้รับ 100 รายการถัดไปหลังจาก 90,000 รายการ รายการใดเร็วกว่า ประโยคแรกหรือประโยคที่สอง
ประโยคแรกคือการใช้บันทึก 90001 แรก นำค่า ID ที่ใหญ่ที่สุดเป็นตัวระบุเริ่มต้น จากนั้นใช้เพื่อค้นหาบันทึก 100 รายการถัดไปอย่างรวดเร็ว ประโยคที่สองคือรับเฉพาะบันทึก 90000 รายการสุดท้าย จากนั้นจึงนำ ค่า ID ใช้เครื่องหมายเริ่มต้นเพื่อค้นหาประโยคแรกของ 100 บันทึกและดำเนินการผลลัพธ์ 100 แถวในชุด (0.23) วินาที
ผลการดำเนินการของประโยค 2.100 แถวในชุด (0.19) วินาที
อันที่จริง ประโยคที่สองสามารถทำให้ง่ายขึ้นเป็น:
เลือก * จาก cyclopedia โดยที่ ID>=(
เลือก ID จากขีดจำกัดของไซโคลพีเดีย 90000,1
)จำกัด 100;
ใช้ ID ของเรกคอร์ดที่ 90,000 โดยตรงโดยไม่ต้องผ่านการดำเนินการ Max ซึ่งควรจะมีประสิทธิภาพมากกว่าในทางทฤษฎี แต่ในการใช้งานจริงแทบมองไม่เห็นเอฟเฟกต์ เนื่องจาก ID ตำแหน่งส่งคืนเพียง 1 เรกคอร์ด และ Max แทบไม่ต้อง เรียกใช้ คุณสามารถรับผลลัพธ์ได้ แต่การเขียนในลักษณะนี้ชัดเจนยิ่งขึ้นโดยไม่จำเป็นต้องวาดงู
เลือก 100 อันดับแรก * จาก cyclopedia โดยที่ ID>=(
เลือกสูงสุด 90001 สูงสุด(ID) จาก (
เลือก ID จาก cyclopedia สั่งซื้อตาม ID
)เป็นทีเอ็มพี
-
แต่ไม่ว่าจะถูกนำไปใช้ในขั้นตอนการจัดเก็บหรือในโค้ดโดยตรง คอขวดอยู่เสมอว่า TOP ของ MS-SQL จะส่งกลับระเบียน N แรกเสมอ สถานการณ์นี้ไม่รู้สึกอย่างลึกซึ้งเมื่อปริมาณข้อมูลไม่มาก แต่ถ้า มีหลายร้อยหรือหลายพันประสิทธิภาพจะต่ำอย่างแน่นอนเมื่อเปรียบเทียบแล้วขีด จำกัด ของ MySQL มีข้อดีหลายประการ
,ดำเนินการ:
เลือก ID จากขีดจำกัดของไซโคลพีเดีย 90000
เลือก ID จากขีดจำกัดของไซโคลพีเดีย 90000,1
ผลลัพธ์คือ:
90,000 แถวในชุด (0.36) วินาที
1 แถวในชุด (0.06) วินาที
MS-SQL สามารถใช้ได้เฉพาะ Select Top 90000 ID From cyclopedia เท่านั้น เวลาดำเนินการคือ 390ms และเวลาดำเนินการของการดำเนินการเดียวกันนั้นไม่ดีเท่ากับ 360ms ของ MySQL
อ็อฟเซ็ตของขีดจำกัดจะใช้เมื่อมีเรคคอร์ดมากขึ้น เมื่อมีเรคคอร์ดน้อยลง อ็อฟเซ็ตก็จะน้อยลง ดังนั้นจึงควรใช้ขีดจำกัดโดยตรง ยิ่งออฟเซ็ตมีขนาดใหญ่เท่าใดค่าหลังก็จะยิ่งดีขึ้นเท่านั้น
//////////////////////////////////////////////// //////////////////////////////
1. เมื่อออฟเซ็ตค่อนข้างน้อย
เลือก * จาก yanxue8_visit จำกัด 10,10
เรียกใช้หลายครั้ง เวลายังคงอยู่ระหว่าง 0.0004-0.0005
เลือก * จาก yanxue8_visit โดยที่ vid >=(
เลือก vid จาก yanxue8_visit สั่งซื้อตามขีดจำกัด vid 10,1
) จำกัด 10
เรียกใช้หลายครั้ง เวลายังคงอยู่ระหว่าง 0.0005-0.0006 ส่วนใหญ่เป็น 0.0006
สรุป: เมื่อออฟเซ็ตมีขนาดเล็ก ควรใช้ลิมิตโดยตรงจะดีกว่า การแสดงนี้เกิดจากแบบสอบถามย่อย
2. เมื่อออฟเซ็ตมีขนาดใหญ่
เลือก * จาก yanxue8_visit จำกัด 10,000,10
ทำงานหลายครั้ง เวลายังคงอยู่ประมาณ 0.0187
เลือก * จาก yanxue8_visit โดยที่ vid >=(
เลือก vid จาก yanxue8_visit สั่งซื้อตามวงเงิน vid 10,000,1
) จำกัด 10
หลังจากการวิ่งหลายครั้ง เวลายังคงอยู่ประมาณ 0.0061 ซึ่งเป็นเพียง 1/3 ของเวลาเดิม ยิ่งค่าชดเชยที่ตั้งไว้ล่วงหน้ามีขนาดใหญ่เท่าใดค่าหลังก็จะยิ่งดีขึ้นเท่านั้น
//////////////////////////////////////////////// /////////////////////////////////////////////////// /
mysql> SELECT * FROM table LIMIT 95,-1; // ดึงข้อมูลแถวที่ 96-สุดท้าย
//หากระบุพารามิเตอร์เพียงตัวเดียว หมายความว่าส่งคืนแถวเรคคอร์ดจำนวนสูงสุด
บทความนี้มาจากบล็อก CSDN โปรดระบุแหล่งที่มาเมื่อพิมพ์ซ้ำ: http://blog.csdn.net/zhqingyun163/archive/2009/12/22/5053579.aspx
-