MIN / MAX เทียบกับ ORDER BY และ LIMIT


104

จากคำถามต่อไปนี้คุณจะพิจารณาวิธีใดที่ดีกว่า เหตุผลของคุณคืออะไร (ประสิทธิภาพของโค้ด, การบำรุงรักษาที่ดีขึ้น, WTFery น้อยลง) ...

SELECT MIN(`field`)
FROM `tbl`;

SELECT `field`
FROM `tbl`
ORDER BY `field`
LIMIT 1;

คำตอบ:


130

ในกรณีที่เลวร้ายที่สุดเมื่อคุณกำลังดูเขตข้อมูลที่ไม่ได้จัดทำดัชนีการใช้MIN()ต้องใช้ตารางผ่านแบบเต็มเพียงครั้งเดียว การใช้SORTและLIMITต้องใช้ filesort หากวิ่งแข่งกับโต๊ะขนาดใหญ่อาจมีความแตกต่างอย่างมีนัยสำคัญในประสิทธิภาพที่ได้รับ ในฐานะที่เป็นจุดข้อมูลที่ไม่มีความหมายMIN()ใช้เวลา. 36 ในขณะที่SORTและLIMITเอา. 84s เทียบกับตาราง 106,000 แถวบนเซิร์ฟเวอร์ dev ของฉัน

อย่างไรก็ตามหากคุณกำลังดูคอลัมน์ที่จัดทำดัชนีความแตกต่างนั้นสังเกตได้ยากกว่า (จุดข้อมูลที่ไม่มีความหมายคือ 0.00s ในทั้งสองกรณี) อย่างไรก็ตามเมื่อมองไปที่ผลลัพธ์ของการอธิบายดูเหมือนว่าMIN()จะสามารถดึงค่าที่น้อยที่สุดออกจากดัชนีได้ ('เลือกตารางที่ปรับให้เหมาะสมที่สุด' และแถว 'NULL') ในขณะที่SORTและLIMITยังจำเป็นต้องทำการส่งผ่านตามลำดับของดัชนี (106,000 แถว) ผลกระทบด้านประสิทธิภาพที่แท้จริงอาจเล็กน้อย

ดูเหมือนว่าMIN()จะเป็นหนทางไป - มันเร็วกว่าในกรณีที่เลวร้ายที่สุดซึ่งแยกไม่ออกในกรณีที่ดีที่สุดคือ SQL มาตรฐานและแสดงออกถึงคุณค่าที่คุณพยายามได้รับอย่างชัดเจนที่สุด กรณีเดียวที่ดูเหมือนว่าจะใช้SORTและLIMITเป็นที่ต้องการก็คือตามที่msonกล่าวไว้ซึ่งคุณกำลังเขียนการดำเนินการทั่วไปที่ค้นหาค่า N ด้านบนหรือด้านล่างจากคอลัมน์โดยพลการและไม่คุ้มที่จะเขียนการดำเนินการกรณีพิเศษ


7
o (n) สำหรับหนึ่งเดียวกับ 0 (nlogn) สำหรับการเรียงลำดับ
Abhishek Iyer

1
@AbhishekIyer คุณพูดถูกทั้งหมด แต่ฉันจะเพิ่ม "ในกรณีที่เลวร้ายที่สุดสำหรับฟิลด์ที่ไม่ได้จัดทำดัชนี"
dmikam

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

ในการทดสอบกับตารางที่จัดทำดัชนีซึ่งมี 470 ล้านแถวทั้งสองคำค้นหาใช้เวลา 0.00 วินาที อย่างไรก็ตามหากเราเพิ่มตัวกรอง "WHERE field2 = x" ลงในแบบสอบถามการค้นหาที่มี LIMIT จะยังคงใช้เวลา 0.00 วินาทีและการสืบค้นที่มี MIN จะใช้เวลา 0.21 วินาที
Antonio Cañas Vargas

13
SELECT MIN(`field`)
FROM `tbl`;

เพียงเพราะเข้ากันได้กับ ANSI ข้อ จำกัด 1 เป็นสิ่งเฉพาะสำหรับ MySql เนื่องจาก TOP คือ SQL Server


DBMS ส่วนใหญ่มีขีด จำกัด / ออฟเซ็ตหรือเทียบเท่าและใช้ในแอปส่วนใหญ่ที่ฉันใช้งานอยู่ (ไม่ใช่ทางเลือกอื่นสำหรับ MIN แต่เพื่อวัตถุประสงค์อื่นเช่นการแบ่งหน้า)
finnw

@finnw - ฉันเห็นด้วย แต่ตัวอย่างของผู้ถามกำลังเปรียบเทียบขีด จำกัด กับขั้นต่ำอย่างชัดเจน
OtávioDécio

10

ดังที่msonและSean McSomethingได้ชี้ให้เห็นว่า MIN เป็นที่ต้องการ

อีกเหตุผลหนึ่งที่ ORDER BY + LIMIT มีประโยชน์คือถ้าคุณต้องการรับค่าของคอลัมน์อื่นที่ไม่ใช่คอลัมน์ MIN

ตัวอย่าง:

SELECT some_other_field, field
FROM tbl
ORDER BY field
LIMIT 1

4

ฉันคิดว่าคำตอบขึ้นอยู่กับสิ่งที่คุณกำลังทำ

หากคุณมีข้อความค้นหา 1 off และความตั้งใจนั้นเรียบง่ายอย่างที่คุณระบุให้เลือก min (ฟิลด์) จะดีกว่า

อย่างไรก็ตามเป็นเรื่องปกติที่ความต้องการประเภทนี้จะเปลี่ยนเป็น - คว้าผลลัพธ์อันดับต้น ๆ , คว้าผลลัพธ์ที่ n - mth เป็นต้น

ฉันไม่คิดว่ามันเป็นความคิดที่แย่เกินไปที่จะผูกมัดกับฐานข้อมูลที่คุณเลือก การเปลี่ยน dbs ไม่ควรกระทำเพียงเล็กน้อยและต้องแก้ไขเป็นราคาที่คุณจ่ายเมื่อทำการย้าย

ทำไมต้อง จำกัด ตัวเองตอนนี้เพราะความเจ็บปวดที่คุณอาจรู้สึกหรือไม่รู้สึกในภายหลัง?

ฉันคิดว่าเป็นการดีที่จะอยู่กับ ANSI ให้มากที่สุด แต่นั่นเป็นเพียงแนวทาง ...


3

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

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