首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL LIMIT 1 避免全表掃描:原理、適用場景與實測數據

     編輯:MySQL 資料庫相關知識

核心原理

無索引欄位查詢時,MySQL 執行**全表掃描**。若明確結果**唯一或只需第一筆**,加上 LIMIT 1 可在找到第一筆匹配後**立即停止掃描**,大幅降低 I/O 與 CPU。

實測對比

表 t_user (1,000,000 筆),email **無索引**,查詢 email='222@xxg.com':

SQL耗時說明
SELECT * FROM t_user WHERE email='222@xxg.com';0.56 秒全表掃描 100 萬列
SELECT * FROM t_user WHERE email='222@xxg.com' LIMIT 1;0.00 秒掃描至第 222 列即停止

適用場景

  • ✅ 唯一業務鍵無索引 (如舊系統 email、phone 未建唯一索引)
  • ✅ 明確只需一筆 (存在性檢查、登入驗證)
  • ✅ 統計計數 SELECT COUNT(*) ... LIMIT 1 配合 EXISTS 更佳

不需加 LIMIT 1 的情況

  • ❌ **主鍵查詢**:WHERE id = ? (PK 索引唯一查找,O(log N))
  • ❌ **唯一索引查詢**:WHERE uk_col = ? (UK 同理)
  • ❌ **覆蓋索引**:索引已包含所有 SELECT 欄位,無回表

測試資料產生腳本

CREATE TABLE t_user (
    id INT PRIMARY KEY AUTO_INCREMENT,
    email VARCHAR(255),
    password VARCHAR(255)
);

DELIMITER //
CREATE PROCEDURE seed_user()
BEGIN
    DECLARE i INT DEFAULT 0;
    START TRANSACTION;
    WHILE i < 1000000 DO
        INSERT INTO t_user VALUES (NULL, CONCAT(i+1, '@xxg.com'), i+1);
        SET i = i + 1;
    END WHILE;
    COMMIT;
END//
DELIMITER ;
CALL seed_user();

避坑指南

LIMIT 1 不是萬靈丹:若查詢條件不具選擇性 (如 WHERE status=1 匹配 90% 資料),仍需掃描大量列。根本解決是**加索引**。

結語

LIMIT 1 是無索引唯一查詢的「止損手段」,能將最壞情況 O(N) 降為平均 O(N/2)。但**長期應補上唯一索引**,從源頭消除全表掃描。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved