Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

วิธีเร็วที่สุดในการหาค่าสูงสุดของคอลัมน์ใน MySQL

เปรียบเทียบ 2 วิธี

วิธีQueryหลักการประสิทธิภาพ
1. MAX()SELECT MAX(col) FROM table;ใช้ Index/Statistic โดยตรง⚡ เร็วที่สุด
2. ORDER BY ... LIMIT 1SELECT 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 เฉพาะต้องการข้อมูลแถวทั้งแถว หรือกรณีพิเศษอื่นๆ