MySQL查詢(xún)優(yōu)化:LIMIT 1避免全表掃描提高查詢(xún)效率
更新時(shí)間:2013年04月19日 15:14:50 作者:
在某些情況下,如果明知道查詢(xún)結(jié)果只有一個(gè),SQL語(yǔ)句中使用LIMIT 1會(huì)提高查詢(xún)效率,感興趣的朋友可以了解下哈,希望對(duì)你優(yōu)化mysql查詢(xún)有所幫助
在某些情況下,如果明知道查詢(xún)結(jié)果只有一個(gè),SQL語(yǔ)句中使用LIMIT 1會(huì)提高查詢(xún)效率。
例如下面的用戶(hù)表(主鍵id,郵箱,密碼):
create table t_user(
id int primary key auto_increment,
email varchar(255),
password varchar(255)
);
每個(gè)用戶(hù)的email是唯一的,如果用戶(hù)使用email作為用戶(hù)名登陸的話(huà),就需要查詢(xún)出email對(duì)應(yīng)的一條記錄。
SELECT * FROM t_user WHERE email=?;
上面的語(yǔ)句實(shí)現(xiàn)了查詢(xún)email對(duì)應(yīng)的一條用戶(hù)信息,但是由于email這一列沒(méi)有加索引,會(huì)導(dǎo)致全表掃描,效率會(huì)很低。
SELECT * FROM t_user WHERE email=? LIMIT 1;
加上LIMIT 1,只要找到了對(duì)應(yīng)的一條記錄,就不會(huì)繼續(xù)向下掃描了,效率會(huì)大大提高。
LIMIT 1適用于查詢(xún)結(jié)果為1條(也可能為0)會(huì)導(dǎo)致全表掃描的的SQL語(yǔ)句。
如果email是索引的話(huà),就不需要加上LIMIT 1,如果是根據(jù)主鍵查詢(xún)一條記錄也不需要LIMIT 1,主鍵也是索引。
例如:
SELECT * FROM t_user WHERE id=?;
就不需要寫(xiě)成:
SELECT * FROM t_user WHERE id=? LIMIT 1;
二者效率沒(méi)有區(qū)別。
附上我做的實(shí)驗(yàn):
存儲(chǔ)過(guò)程生成100萬(wàn)條數(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
查詢(xún)語(yǔ)句
SELECT * FROM t_user WHERE email='222@xxg.com'; 耗時(shí)0.56 s
SELECT * FROM t_user WHERE email='222@xxg.com' LIMIT 1; 耗時(shí)0.00 s
例如下面的用戶(hù)表(主鍵id,郵箱,密碼):
復(fù)制代碼 代碼如下:
create table t_user(
id int primary key auto_increment,
email varchar(255),
password varchar(255)
);
每個(gè)用戶(hù)的email是唯一的,如果用戶(hù)使用email作為用戶(hù)名登陸的話(huà),就需要查詢(xún)出email對(duì)應(yīng)的一條記錄。
SELECT * FROM t_user WHERE email=?;
上面的語(yǔ)句實(shí)現(xiàn)了查詢(xún)email對(duì)應(yīng)的一條用戶(hù)信息,但是由于email這一列沒(méi)有加索引,會(huì)導(dǎo)致全表掃描,效率會(huì)很低。
SELECT * FROM t_user WHERE email=? LIMIT 1;
加上LIMIT 1,只要找到了對(duì)應(yīng)的一條記錄,就不會(huì)繼續(xù)向下掃描了,效率會(huì)大大提高。
LIMIT 1適用于查詢(xún)結(jié)果為1條(也可能為0)會(huì)導(dǎo)致全表掃描的的SQL語(yǔ)句。
如果email是索引的話(huà),就不需要加上LIMIT 1,如果是根據(jù)主鍵查詢(xún)一條記錄也不需要LIMIT 1,主鍵也是索引。
例如:
SELECT * FROM t_user WHERE id=?;
就不需要寫(xiě)成:
SELECT * FROM t_user WHERE id=? LIMIT 1;
二者效率沒(méi)有區(qū)別。
附上我做的實(shí)驗(yàn):
存儲(chǔ)過(guò)程生成100萬(wàn)條數(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
查詢(xún)語(yǔ)句
復(fù)制代碼 代碼如下:
SELECT * FROM t_user WHERE email='222@xxg.com'; 耗時(shí)0.56 s
SELECT * FROM t_user WHERE email='222@xxg.com' LIMIT 1; 耗時(shí)0.00 s

您可能感興趣的文章:
- MySQL查詢(xún)結(jié)果復(fù)制到新表的方法(更新、插入)
- mysql查詢(xún)表里的重復(fù)數(shù)據(jù)方法
- Python中模塊pymysql查詢(xún)結(jié)果后如何獲取字段列表
- Mysql查詢(xún)表中最小可用id值的方法
- 使用pymysql查詢(xún)數(shù)據(jù)庫(kù),把結(jié)果保存為列表并獲取指定元素下標(biāo)實(shí)例
- mysql查詢(xún)表是否被鎖的方法
- mysql查詢(xún)優(yōu)化之100萬(wàn)條數(shù)據(jù)的一張表優(yōu)化方案
- Mysql查詢(xún)時(shí)間區(qū)間日期列表實(shí)例代碼
- MySQL實(shí)現(xiàn)查詢(xún)數(shù)據(jù)庫(kù)表記錄數(shù)
相關(guān)文章
解決mysql與navicat建立連接出現(xiàn)1251錯(cuò)誤
在本篇文章里小編給大家整理了一篇關(guān)于mysql與navicat建立連接出現(xiàn)1251錯(cuò)誤怎么解決的技術(shù)文章,需要的朋友們參考下。2019-08-08MySQL性能參數(shù)詳解之Max_connect_errors 使用介紹
這篇文章主要介紹了MySQL性能參數(shù)詳解之Max_connect_errors 使用介紹,需要的朋友可以參考下2016-05-05MySQL中配置文件my.cnf因權(quán)限問(wèn)題導(dǎo)致無(wú)法啟動(dòng)的解決方法
這篇文章主要給大家介紹了關(guān)于MySQL中配置文件my.cnf因權(quán)限問(wèn)題導(dǎo)致無(wú)法啟動(dòng)的解決方法,該無(wú)法啟動(dòng)的錯(cuò)誤提示代碼是:World-writable config file '/etc/my.cnf' is ignored,文中給出了詳細(xì)的解決方法,需要的朋友們下面來(lái)一起看看吧。2017-06-06mysql unsigned 用法及相減出現(xiàn)補(bǔ)數(shù)溢出解決方法
unsigned表示無(wú)符號(hào)的意思,也就是非負(fù)數(shù),只用于整型并且unsigned 是MYSQL自定義的類(lèi)型,非標(biāo)準(zhǔn)SQL。用途1是紅苕說(shuō)的起到約束數(shù)值的作用,2是可以增加數(shù)值范圍(相當(dāng)于把負(fù)數(shù)那部分加到正數(shù)上)。不過(guò)少用,不方便移植2012-04-04Windows下MySQL8.0.11社區(qū)綠色版安裝步驟圖解
在本教程中使用MySQL最新的MySQL服務(wù)8.0.11的社區(qū)綠色版本進(jìn)行安裝,綠色版為zip格式的包,安裝步驟分為四大步驟,具體哪四大步驟大家跟隨腳本之家小編一起學(xué)習(xí)吧2018-05-05