“ จำกัด 1,000,25” เทียบกับ“ จำกัด 25 ออฟเซ็ต 1,000”


11

เมื่อเร็ว ๆ นี้ฉันพบว่า MySQL มีoffsetคุณสมบัติ ฉันพยายามค้นหาเอกสารเกี่ยวกับผลลัพธ์ของออฟเซ็ตหรือความแตกต่างระหว่างออฟเซ็ตและตัวแปรลิมิต แต่ดูเหมือนไม่พบสิ่งที่ฉันกำลังมองหา

ให้บอกว่าฉันมี 10.000 แถวในตารางและฉันต้องการผลลัพธ์ 25 รายการจากแถว 1.000 เท่าที่ฉันทำได้ฉันสามารถทำทั้งสองอย่างเพื่อให้ได้ผลลัพธ์เดียวกัน:

SELECT id,name,description FROM tablename LIMIT 1000,25
SELECT id,name,description FROM tablename LIMIT 25 OFFSET 1000

สิ่งที่ฉันอยากรู้คือความแตกต่างระหว่างคนทั้งสอง

  • สิ่งนี้ทำสิ่งเดียวกันหรือเข้าใจผิดหรือเปล่า?
  • เป็นหนึ่งช้าลง / เร็วขึ้นในตารางขนาดใหญ่
  • ผลลัพธ์ของการเปลี่ยนแปลงออฟเซ็ตเกิดขึ้นเมื่อฉันWHERE column=1(คอลัมน์พูดมีมากกว่า 100 ค่าที่ต่างกัน)
  • ผลลัพธ์ของการเปลี่ยนแปลงออฟเซ็ตเกิดขึ้นเมื่อฉันหรือไม่ORDER BY column ASC(เนื่องจากมีค่าสุ่ม)

หากนี่เป็นคำถาม 'โง่' และมีคนรู้จักเอกสารใด ๆ ที่ให้ความกระจ่างเรื่องนี้โปรดเพิ่มพวกเขาในการตอบกลับ
ฉันมีความรู้สึกตรงข้ามข้ามแถว X แรกที่พบในฐานข้อมูลโดยไม่คำนึงถึงการเรียงลำดับและตำแหน่ง


เอกสาร MySQL อธิบายสิ่งนี้ได้อย่างสมบูรณ์แบบ มีเหตุผลที่คุณไม่สนใจดูด้วยตัวเองหรือไม่?
siride

1
"สำหรับความเข้ากันได้กับ PostgreSQL นั้น MySQL ยังรองรับการชดเชยออฟไลน์ของ row_count OFFSET อีกด้วย" (จากdev.mysql.com/doc/refman/5.5/en/select.html )
siride

เพราะสิ่งนี้ยังไม่ตอบคำถามของฉัน จากคำพูดของคุณ (และข้อความของพวกเขาในหน้า) ฉันควรสรุปว่าออฟเซ็ตเป็นสิ่งเดียวกับขีด จำกัด เขียนเฉพาะแตกต่างกันราวกับว่า LIMIT เป็นตัวเลือกชวเลข
Martijn

1
มันเป็นไวยากรณ์ที่แตกต่างกันสำหรับการแสดงสิ่งเดียวกัน คำถามย่อยอื่น ๆ ของคุณแตกต่างจากชื่อและส่วนแรกของโพสต์ของคุณอย่างสิ้นเชิง
siride

1
ฉันเข้าใจว่าหากเป็นสิ่งเดียวกันแบบสอบถามอื่น ๆ จะไม่ได้รับผลกระทบที่แตกต่างกันในแต่ละสถานการณ์ ฉันแค่ไม่เชื่อว่ามันเป็นสิ่งเดียวกันนั่นคือคำตอบที่ฉันกำลังมองหาขอบคุณ
Martijn

คำตอบ:


9

ในแง่ของการดำเนินงาน

SELECT id,name,description FROM tablename LIMIT 1000,25
SELECT id,name,description FROM tablename LIMIT 25 OFFSET 1000

ไม่มีความแตกต่างในแถลงการณ์

ความเห็นของ @ siride เป็นประเด็นตรง

LIMIT 1000,25 วิธี LIMIT 25 OFFSET 1000

จากเอกสารเดียวกัน

LIMIT row_count เทียบเท่ากับ LIMIT 0, row_count

คำถามจริงของคุณ

  • สิ่งนี้ทำสิ่งเดียวกันหรือเข้าใจผิดหรือเปล่า?
  • เป็นหนึ่งช้าลง / เร็วขึ้นในตารางขนาดใหญ่

เนื่องจากข้อความค้นหาทั้งสองเหมือนกันจึงไม่มีความแตกต่าง

  • ผลลัพธ์ของการเปลี่ยนแปลงออฟเซ็ตเมื่อฉันทำคอลัมน์ WHERE = 1 (พูดว่าคอลัมน์มีค่าที่แตกต่างกันมากกว่า 100 ค่า)
  • ผลลัพธ์ของการเปลี่ยนแปลงออฟเซ็ตเมื่อฉันเรียงลำดับตามคอลัมน์ ASC หรือไม่ (เนื่องจากมีค่าสุ่ม)

การใช้LIMITไม่ได้เปลี่ยนชุดผลลัพธ์ใด ๆ พวกเขานำทางภายในชุดผลลัพธ์

แบบสอบถามนี้

SELECT id,name,description FROM tablename ORDER BY id LIMIT 1000,25

จะแตกต่างจาก

SELECT * FROM (SELECT id,name,description FROM tablename LIMIT 1000,25) A ORDER BY id;

เนื่องจาก LIMIT ถูกนำไปใช้ในขั้นตอนอื่น

แบบสอบถามแรกจะไม่ส่งคืนอะไรถ้า tablename มีน้อยกว่า 1,000 แถว

แบบสอบถามที่สองไม่ส่งคืนอะไรถ้าแบบสอบถามย่อยมีน้อยกว่า 1,000 แถว

สรุปผลการศึกษา

คุณจะต้องสร้างแบบสอบถามเพื่อให้แน่ใจว่าคุณกำลังเรียงลำดับข้อมูลในระยะที่เหมาะสม


1
ขอขอบคุณ. สิ่งนี้: "ไม่มีความแตกต่างในแถลงการณ์" เป็นสิ่งที่ฉันกำลังมองหาและด้วยข้อมูลที่ฉันสามารถเห็นการเรียงลำดับนั้นหรือที่ไม่สำคัญ ไม่แน่ใจว่ามันเป็นสิ่งเดียวกันและในการเขียนรหัสมารอยู่ในรายละเอียดฉันต้องการทราบอย่างแน่นอน :)
Martijn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.