在**無索引**或**非唯一索引**的大表上,查詢預期只返回一條記錄時,加上 LIMIT 1 可讓 MySQL 掃描到第一條匹配行即停止,**避免全表掃描**,顯著降低延遲。
| SQL 語句 | 耗時 | 說明 |
|---|---|---|
SELECT * FROM member WHERE username='www.phpernote.com'; | 0.56 秒 | 全表掃描,讀取所有匹配行 (雖然只有 1 條,但引擎不知情) |
SELECT * FROM member WHERE username='www.phpernote.com' LIMIT 1; | 0.28 秒 | 掃描到第一條匹配即返回,I/O 減半 |
WHERE 條件。LIMIT:必須掃描**整張表**確認是否還有其他匹配行。LIMIT 1:找到第一條匹配行即終止查詢,返回結果。如果
username有 **唯一索引** (或主鍵),MySQL 優化器知道最多返回 1 行,**自動優化為單行讀取**,此時LIMIT 1無額外收益 (甚至極微增加解析開銷)。
ORDER BY id DESC LIMIT 1)。LIMIT 1 減少回表次數。-- ❌ 錯誤:LIMIT 1 掩蓋了數據質量問題 (實際有重複數據) SELECT * FROM orders WHERE user_id = 123 LIMIT 1; -- ✅ 正確:業務上應保證唯一,建立唯一索引 ALTER TABLE orders ADD UNIQUE KEY uk_user_id (user_id); -- 然後可直接查,無需 LIMIT 1 SELECT * FROM orders WHERE user_id = 123;
LIMIT 1 配合 ORDER BY 陷阱-- 獲取最新訂單 SELECT * FROM orders WHERE user_id = 123 ORDER BY created_at DESC LIMIT 1;
(user_id, created_at DESC):極快,索引下推直接取第一條。LIMIT 1 是**無唯一索引大表單行查詢**的利器,實測可減半耗時。ORDER BY 時,**必須有對應複合索引**,否則得不償失。LIMIT 1 / 是否有唯一索引」。