จากคำถามต่อไปนี้คุณจะพิจารณาวิธีใดที่ดีกว่า เหตุผลของคุณคืออะไร (ประสิทธิภาพของโค้ด, การบำรุงรักษาที่ดีขึ้น, WTFery น้อยลง) ...
SELECT MIN(`field`)
FROM `tbl`;
SELECT `field`
FROM `tbl`
ORDER BY `field`
LIMIT 1;
จากคำถามต่อไปนี้คุณจะพิจารณาวิธีใดที่ดีกว่า เหตุผลของคุณคืออะไร (ประสิทธิภาพของโค้ด, การบำรุงรักษาที่ดีขึ้น, WTFery น้อยลง) ...
SELECT MIN(`field`)
FROM `tbl`;
SELECT `field`
FROM `tbl`
ORDER BY `field`
LIMIT 1;
คำตอบ:
ในกรณีที่เลวร้ายที่สุดเมื่อคุณกำลังดูเขตข้อมูลที่ไม่ได้จัดทำดัชนีการใช้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 ด้านบนหรือด้านล่างจากคอลัมน์โดยพลการและไม่คุ้มที่จะเขียนการดำเนินการกรณีพิเศษ
SELECT MIN(`field`)
FROM `tbl`;
เพียงเพราะเข้ากันได้กับ ANSI ข้อ จำกัด 1 เป็นสิ่งเฉพาะสำหรับ MySql เนื่องจาก TOP คือ SQL Server
ดังที่msonและSean McSomethingได้ชี้ให้เห็นว่า MIN เป็นที่ต้องการ
อีกเหตุผลหนึ่งที่ ORDER BY + LIMIT มีประโยชน์คือถ้าคุณต้องการรับค่าของคอลัมน์อื่นที่ไม่ใช่คอลัมน์ MIN
ตัวอย่าง:
SELECT some_other_field, field
FROM tbl
ORDER BY field
LIMIT 1
ฉันคิดว่าคำตอบขึ้นอยู่กับสิ่งที่คุณกำลังทำ
หากคุณมีข้อความค้นหา 1 off และความตั้งใจนั้นเรียบง่ายอย่างที่คุณระบุให้เลือก min (ฟิลด์) จะดีกว่า
อย่างไรก็ตามเป็นเรื่องปกติที่ความต้องการประเภทนี้จะเปลี่ยนเป็น - คว้าผลลัพธ์อันดับต้น ๆ , คว้าผลลัพธ์ที่ n - mth เป็นต้น
ฉันไม่คิดว่ามันเป็นความคิดที่แย่เกินไปที่จะผูกมัดกับฐานข้อมูลที่คุณเลือก การเปลี่ยน dbs ไม่ควรกระทำเพียงเล็กน้อยและต้องแก้ไขเป็นราคาที่คุณจ่ายเมื่อทำการย้าย
ทำไมต้อง จำกัด ตัวเองตอนนี้เพราะความเจ็บปวดที่คุณอาจรู้สึกหรือไม่รู้สึกในภายหลัง?
ฉันคิดว่าเป็นการดีที่จะอยู่กับ ANSI ให้มากที่สุด แต่นั่นเป็นเพียงแนวทาง ...
ด้วยประสิทธิภาพที่ยอมรับได้ฉันจะใช้อันแรกเนื่องจากมีความหมายใกล้เคียงกับเจตนามากขึ้น
หากประสิทธิภาพเป็นปัญหา (เครื่องมือเพิ่มประสิทธิภาพที่ทันสมัยส่วนใหญ่จะเพิ่มประสิทธิภาพทั้งสองอย่างให้เหมาะสมกับแผนการสืบค้นเดียวกันแม้ว่าคุณจะต้องทดสอบเพื่อตรวจสอบก็ตาม) แน่นอนว่าฉันจะใช้วิธีที่เร็วกว่า