การเพิ่ม 'LIMIT 1' ในการสืบค้น MySQL ทำให้เร็วขึ้นเมื่อคุณรู้ว่าจะมีผลลัพธ์เพียง 1 รายการหรือไม่?


86

เมื่อฉันเพิ่ม LIMIT 1 ลงในแบบสอบถาม MySQL จะหยุดการค้นหาหรือไม่หลังจากพบผลลัพธ์ 1 รายการ (ทำให้เร็วขึ้น) หรือยังคงดึงผลลัพธ์ทั้งหมดและตัดทอนในตอนท้าย?


1
ไม่ได้ถ้ามีUNIQUE(หรือPRIMARY KEY) จำกัด (หรือดัชนี) ในคอลัมน์กรอง stackoverflow.com/questions/8467092/…
ma11hew28

คำตอบ:


81

ขึ้นอยู่กับข้อความค้นหาการเพิ่มข้อ จำกัด อาจมีผลอย่างมากต่อประสิทธิภาพ หากคุณต้องการเพียงแถวเดียว (หรือทราบว่ามีเพียงแถวเดียวเท่านั้นที่สามารถตอบสนองการสืบค้นได้) และไม่แน่ใจว่าเครื่องมือเพิ่มประสิทธิภาพภายในจะดำเนินการอย่างไร (ตัวอย่างเช่น WHERE clause ไม่ตีดัชนีเป็นต้น) คุณควรเพิ่ม LIMIT อนุประโยค

สำหรับคำค้นหาที่ปรับให้เหมาะสม (โดยใช้ดัชนีบนตารางขนาดเล็ก) อาจไม่สำคัญกับประสิทธิภาพมากนัก แต่อีกครั้ง - หากคุณสนใจเพียงแถวเดียวมากกว่าที่จะเพิ่มส่วนคำสั่ง LIMIT โดยไม่คำนึงถึง


30
สำหรับวัตถุประสงค์ในการป้องกันจุดบกพร่องคุณอาจต้องการพิจารณาส่ง LIMIT 2 แล้วบ่นหรือระเบิดออกหากข้อสันนิษฐานแถวเดียวของคุณไม่ได้รับการระงับ
Jeffrey Hantin

6
@JeffreyHantin หากมีเพียงหนึ่งเดียวคุณควรเพิ่มข้อ จำกัด เฉพาะให้กับฐานข้อมูล สะอาดกว่ามากจากนั้นทำให้รหัสของคุณยุ่งเหยิงด้วยการตรวจสอบสติ
Cristian Vrabie

@CristianVrabie หากสามารถแสดงเป็นข้อ จำกัด เฉพาะได้แน่นอน แต่นั่นเป็นการยืนยันเกี่ยวกับข้อมูลในตาราง การส่ง LIMIT 2 และการตรวจสอบ 1 เป็นการยืนยันเกี่ยวกับแบบสอบถามเองซึ่งอาจมีข้อบกพร่องเช่นเงื่อนไขการเข้าร่วมที่ระบุไม่เพียงพอ
Jeffrey Hantin

1
@JeffreyHantin พอใช้ แต่ยกเว้นถ้าคุณเขียนโค้ดสำหรับ Mars Rover คุณเขียนการทดสอบสำหรับสิ่งนี้แทนที่จะทำให้รหัสของคุณเป็นมลพิษ
Cristian Vrabie

8
@JeffreyHantin หากสมมติฐานว่ามีเพียงอันเดียวที่ถูกต้องการเพิ่ม LIMIT 2 จะไม่ฆ่าการเพิ่มประสิทธิภาพใด ๆ เนื่องจากจะค้นหาแถวทั้งหมดหรือไม่ การเพิ่ม LIMIT 2 ในกรณีนั้นจะไม่ดีไปกว่าการเพิ่มอะไรเลย
Chris Middleton

19

ขีด จำกัด อาจส่งผลต่อประสิทธิภาพของแบบสอบถาม (ดูความคิดเห็นและลิงค์ด้านล่าง) และยังลดชุดผลลัพธ์ที่ส่งออกโดย MySQL สำหรับข้อความค้นหาที่คุณคาดหวังผลลัพธ์เดียวจะมีประโยชน์

ยิ่งไปกว่านั้นการ จำกัด ชุดผลลัพธ์สามารถเร่งเวลาในการสืบค้นทั้งหมดได้เนื่องจากการถ่ายโอนชุดผลลัพธ์ขนาดใหญ่ใช้หน่วยความจำและอาจสร้างตารางชั่วคราวบนดิสก์ ฉันพูดถึงสิ่งนี้เนื่องจากฉันเพิ่งเห็นแอปพลิเคชันที่ไม่ได้ใช้การ จำกัด การฆ่าเซิร์ฟเวอร์เนื่องจากชุดผลลัพธ์ขนาดใหญ่และด้วยขีด จำกัด การใช้ทรัพยากรจึงลดลงอย่างมาก

ตรวจสอบหน้านี้เพื่อดูรายละเอียดเพิ่มเติม: เอกสาร MySQL: LIMIT Optimization


หน้าที่คุณเชื่อมโยงระบุว่า: "หากคุณกำลังเลือกเพียงไม่กี่แถวที่มี LIMIT MySQL จะใช้ดัชนีในบางกรณีเมื่อปกติแล้วมันจะต้องการสแกนแบบเต็มตาราง" ดูเหมือนว่าแบบสอบถามจะไม่ได้รับการประมวลผลตามปกติ
เช

จุดดี. ฉันสร้างลักษณะทั่วไปโดยอาศัยการสังเกตจากการใช้ EXPLAIN ขอบคุณสำหรับการจับ
rjamestaylor

ลิงค์ได้รับการชื่นชมมาก FWIW ส่วนใหญ่ของคำตอบนี้ดูเหมือนว่าจะนำไปใช้กับสถานการณ์ที่ไม่ จำกัด อาจจะมีชุดผลขนาดใหญ่ คำถามคือถามว่ามันสำคัญหรือไม่เมื่อมีเพียง 1 แถวเท่านั้นที่จะจับคู่ได้สำเร็จ ซึ่งในกรณีนี้ "ชุดผลลัพธ์" จะเป็นเพียง 1 แถวเท่านั้น (แม้จะไม่มีขีด จำกัด )
ToolmakerSteve

5

หากมีผลลัพธ์กลับมาเพียง 1 รายการไม่ LIMIT จะไม่ทำให้เร็วขึ้น หากมีผลลัพธ์จำนวนมากและคุณต้องการเพียงผลลัพธ์แรกและไม่มี GROUP หรือ ORDER ตามคำสั่ง LIMIT จะทำให้เร็วขึ้น


2
ควรเร็วกว่าแม้จะมี 1 แถวหากไม่มีคีย์ที่ไม่ซ้ำกัน / คีย์หลักเนื่องจากหยุดค้นหาหลังจากพบเหตุการณ์แรก
the_nuts

คริสประโยคแรกของคุณสามารถอ่านได้หนึ่งในสองวิธี หากคุณหมายถึง "อาจส่งคืนได้เพียง 1 แถว" (เช่นการค้นหาคอลัมน์ที่ไม่ซ้ำกัน) สิ่งที่คุณพูดจะเป็นจริง OTOH หากคุณหมายถึงขีด จำกัด "เมื่อใดก็ตามที่พบผลลัพธ์ที่ตรงกันเพียง 1 รายการ" จะไม่ทำให้เร็วขึ้น: แน่ใจหรือ บางครั้งก็หลีกเลี่ยงไม่ให้ดึงหน้าเพิ่มเติมหรือไม่?
ToolmakerSteve

5

คำตอบสั้น ๆ คือใช่ หากคุณ จำกัด ผลลัพธ์ไว้ที่ 1 แม้ว่าคุณจะ "คาดหวัง" ผลลัพธ์เดียวการสืบค้นจะเร็วขึ้นเนื่องจากฐานข้อมูลของคุณจะไม่ดูบันทึกทั้งหมดของคุณ มันจะหยุดเมื่อพบบันทึกที่ตรงกับข้อความค้นหาของคุณ


1
คำตอบนี้ทำให้เข้าใจผิดเพราะไม่มีข้อแม้ที่เห็นในความคิดเห็นเกี่ยวกับคำตอบอื่น ๆ (7 ปีก่อนหน้านี้!) ว่าถ้า DB รู้ว่ามีเพียงระเบียนเดียวเท่านั้นที่สามารถจับคู่ได้ (เช่นการสืบค้นคอลัมน์ที่ไม่ซ้ำกัน) ขีด จำกัด 1 จะไม่มีผล
ToolmakerSteve

อย่างจริงจัง? เครื่องมือเพิ่มประสิทธิภาพการสืบค้นสามารถใช้ประโยชน์จากข้อเท็จจริงที่ว่าเงื่อนไขบางประการรับประกันว่าสามารถส่งคืนระเบียนได้เพียง 1 รายการ ฉันชี้ให้เห็นว่าคำตอบของคุณไม่ถูกต้องในทุกสถานการณ์ (ดังนั้นจึงลบมูลค่าจากสิ่งที่กล่าวไปแล้วเมื่อหลายปีก่อน) หากคุณเห็นด้วยคุณสามารถรับทราบความถูกต้องของความคิดเห็นของฉัน หากคุณไม่เห็นด้วยคุณสามารถชี้แจงเหตุผลได้
ToolmakerSteve

1

หากคุณคาดหวังเพียงผลลัพธ์เดียวจริงๆคุณควรเพิ่ม LIMIT ต่อท้ายข้อความค้นหาของคุณ ฉันไม่รู้การทำงานภายในของ MySQL แต่ฉันแน่ใจว่าจะไม่รวบรวมชุดผลลัพธ์ 100'000 + บันทึกเพียงเพื่อตัดทอนกลับเป็น 1 ในตอนท้าย ..

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