無索引欄位查詢時,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 更佳WHERE id = ? (PK 索引唯一查找,O(log N))WHERE uk_col = ? (UK 同理)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)。但**長期應補上唯一索引**,從源頭消除全表掃描。