MySQL查詢優(yōu)化:LIMIT 1避免全表掃描提高查詢效率
更新時間:2013年04月19日 15:14:50 作者:
在某些情況下,如果明知道查詢結(jié)果只有一個,SQL語句中使用LIMIT 1會提高查詢效率,感興趣的朋友可以了解下哈,希望對你優(yōu)化mysql查詢有所幫助
在某些情況下,如果明知道查詢結(jié)果只有一個,SQL語句中使用LIMIT 1會提高查詢效率。
例如下面的用戶表(主鍵id,郵箱,密碼):
create table t_user(
id int primary key auto_increment,
email varchar(255),
password varchar(255)
);
每個用戶的email是唯一的,如果用戶使用email作為用戶名登陸的話,就需要查詢出email對應(yīng)的一條記錄。
SELECT * FROM t_user WHERE email=?;
上面的語句實現(xiàn)了查詢email對應(yīng)的一條用戶信息,但是由于email這一列沒有加索引,會導(dǎo)致全表掃描,效率會很低。
SELECT * FROM t_user WHERE email=? LIMIT 1;
加上LIMIT 1,只要找到了對應(yīng)的一條記錄,就不會繼續(xù)向下掃描了,效率會大大提高。
LIMIT 1適用于查詢結(jié)果為1條(也可能為0)會導(dǎo)致全表掃描的的SQL語句。
如果email是索引的話,就不需要加上LIMIT 1,如果是根據(jù)主鍵查詢一條記錄也不需要LIMIT 1,主鍵也是索引。
例如:
SELECT * FROM t_user WHERE id=?;
就不需要寫成:
SELECT * FROM t_user WHERE id=? LIMIT 1;
二者效率沒有區(qū)別。
附上我做的實驗:
存儲過程生成100萬條數(shù)據(jù):
BEGIN
DECLARE i INT;
START TRANSACTION;
SET i=0;
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
查詢語句
SELECT * FROM t_user WHERE email='222@xxg.com'; 耗時0.56 s
SELECT * FROM t_user WHERE email='222@xxg.com' LIMIT 1; 耗時0.00 s
例如下面的用戶表(主鍵id,郵箱,密碼):
復(fù)制代碼 代碼如下:
create table t_user(
id int primary key auto_increment,
email varchar(255),
password varchar(255)
);
每個用戶的email是唯一的,如果用戶使用email作為用戶名登陸的話,就需要查詢出email對應(yīng)的一條記錄。
SELECT * FROM t_user WHERE email=?;
上面的語句實現(xiàn)了查詢email對應(yīng)的一條用戶信息,但是由于email這一列沒有加索引,會導(dǎo)致全表掃描,效率會很低。
SELECT * FROM t_user WHERE email=? LIMIT 1;
加上LIMIT 1,只要找到了對應(yīng)的一條記錄,就不會繼續(xù)向下掃描了,效率會大大提高。
LIMIT 1適用于查詢結(jié)果為1條(也可能為0)會導(dǎo)致全表掃描的的SQL語句。
如果email是索引的話,就不需要加上LIMIT 1,如果是根據(jù)主鍵查詢一條記錄也不需要LIMIT 1,主鍵也是索引。
例如:
SELECT * FROM t_user WHERE id=?;
就不需要寫成:
SELECT * FROM t_user WHERE id=? LIMIT 1;
二者效率沒有區(qū)別。
附上我做的實驗:
存儲過程生成100萬條數(shù)據(jù):
復(fù)制代碼 代碼如下:
BEGIN
DECLARE i INT;
START TRANSACTION;
SET i=0;
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
查詢語句
復(fù)制代碼 代碼如下:
SELECT * FROM t_user WHERE email='222@xxg.com'; 耗時0.56 s
SELECT * FROM t_user WHERE email='222@xxg.com' LIMIT 1; 耗時0.00 s
相關(guān)文章
MySQL鎖等待超時問題的原因和解決方案(Lock wait timeout exceed
在數(shù)據(jù)庫開發(fā)和管理中,鎖等待超時是一個常見而棘手的問題,對于使用 MySQL 的應(yīng)用程序,尤其是采用 InnoDB 存儲引擎的場景,這一問題更是屢見不鮮,本文給大家介紹了MySQL鎖等待超時問題的原因和解決方案,需要的朋友可以參考下2024-11-11
mysql 查詢數(shù)據(jù)庫響應(yīng)時長的方法示例
要查詢MySQL數(shù)據(jù)庫的響應(yīng)時長,通常我們需要測量查詢執(zhí)行的時間,本文主要介紹了mysql 查詢數(shù)據(jù)庫響應(yīng)時長的方法示例,具有一定的參考價值,感興趣的可以了解一下2024-06-06
MySQL5.7安裝過程并重置root密碼的方法(shell 腳本)
由于 MySQL 5.7 版本的 root 密碼是首次啟動時隨機(jī)生成的,并且還要求必須修改后才能使用。下面小編給大家分享使用shell 腳本完成安裝和設(shè)置新的 root 密碼的方法,一起看看吧2016-12-12
MySQL調(diào)優(yōu)之SQL查詢深度分頁問題
本文主要介紹了MySQL調(diào)優(yōu)之SQL查詢深度分頁問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03

