เปรียบเทียบ 2 วิธี
| วิธี | Query | หลักการ | ประสิทธิภาพ |
|---|---|---|---|
| 1. MAX() | SELECT MAX(col) FROM table; | ใช้ Index/Statistic โดยตรง | ⚡ เร็วที่สุด |
| 2. ORDER BY ... LIMIT 1 | SELECT col FROM table ORDER BY col DESC LIMIT 1; | Sort ทั้งตาราง แล้ว取 LIMIT 1 | 🐢 ช้ากว่า |
ทำไม MAX() เร็วกว่า?
- MAX() - Optimizer รู้ว่าแค่หาค่าสูงสุด ใช้ Index (B-Tree) ไปหาค่าสุดท้ายทันที O(log n) หรือ O(1) ถ้ามี Statistic
- ORDER BY ... LIMIT 1 - ต้อง Sort ข้อมูลทั้งหมด (Filesort) ก่อน แล้วค่อย取 1 แถว O(n log n)
ตัวอย่างทดสอบ
1. สร้างตารางและข้อมูล
CREATE TABLE DemoTable (Number INT);
INSERT INTO DemoTable VALUES (78), (87), (89), (69), (87);
2. วิธี 1: MAX() (แนะนำ)
SELECT MAX(Number) FROM DemoTable;
+-------------+
| MAX(Number) |
+-------------+
| 89 |
+-------------+
3. วิธี 2: ORDER BY ... LIMIT 1
SELECT Number FROM DemoTable ORDER BY Number DESC LIMIT 1;
+--------+
| Number |
+--------+
| 89 |
+--------+
กรณีพิเศษ: MAX() กับ WHERE
-- หาค่าสูงสุดในเงื่อนไข
SELECT MAX(Price) FROM Products WHERE Category = 'Electronics';
กรณีที่ ORDER BY LIMIT มีประโยชน์
- ต้องการคอลัมน์อื่นของแถวที่มีค่าสูงสุด (ไม่ใช่แค่ค่า MAX)
- ไม่มี Index บนคอลัมน์นั้น
- ต้องการ Top-N (หลายแถว) ไม่ใช่แค่ Top-1
ดึงแถวเต็มที่มีค่าสูงสุด
-- ใช้ Subquery
SELECT * FROM DemoTable WHERE Number = (SELECT MAX(Number) FROM DemoTable);
-- MySQL 8.0+ ใช้ Window Function
SELECT * FROM (
SELECT *, ROW_NUMBER() OVER (ORDER BY Number DESC) AS rn
FROM DemoTable
) t WHERE rn = 1;
สรุป
ใช้ MAX(column) เพื่อหาค่าสูงสุด - เร็วที่สุด ใช้ Index ได้โดยตรง
ใช้ ORDER BY ... LIMIT 1 เฉพาะต้องการข้อมูลแถวทั้งแถว หรือกรณีพิเศษอื่นๆ