LIMIT 1的簡單用法
1/數(shù)據(jù)庫優(yōu)化一直都是DBA(數(shù)據(jù)庫管理員)的核心技能驹尼,今天學(xué)到了一個新的優(yōu)化方式來分享給大家:LIMIT 1
“LIMIT”是MySql數(shù)據(jù)庫中的一個關(guān)鍵字,常見的用于分頁程帕,那么它是如何做到優(yōu)化數(shù)據(jù)的作用呢?
首先我們先來看一下LIMIT 1的作用愁拭,作用就是:只返回一條記錄亏吝,即使有多條也忽略其他只返回第一條岭埠。
當(dāng)我們知道某條SQL語句的返回結(jié)果永遠(yuǎn)只有一條的時候(例如用戶登錄)它就派上用場了蔚鸥。
LIMIT 的高級用法
1.語法:limit [offset,] rows
一般是用于select語句中用以從結(jié)果集中拿出特定的一部分?jǐn)?shù)據(jù)。
offset是偏移量馆类,表示我們現(xiàn)在需要的數(shù)據(jù)是跳過多少行數(shù)據(jù)之后的,可以忽略乾巧;rows表示我們現(xiàn)在要拿多少行數(shù)據(jù)预愤。
2.栗子:
1)select * from mytbl limit 10000,100
上邊SQL語句表示從表mytbl中拿數(shù)據(jù)沟于,跳過10000行之后植康,拿100行
2)select * from mytbl limit 0,100
表示從表mytbl拿數(shù)據(jù),跳過0行之后泳秀,拿取100行
3)select * from mytbl limit 100
這條SQL跟2)的效果是完全一樣的标沪,表示拿前100條數(shù)據(jù)
4)mysql> SELECT * FROM table LIMIT 95,-1;
為了檢索從某一個偏移量到記錄集的結(jié)束所有的記錄行嗜傅,
可以指定第二個參數(shù)為 -1:這條SQL檢索記錄行 96-last
3.用處:
我目前用到的地方是數(shù)據(jù)庫查詢分頁檩赢,比如前臺要展示數(shù)據(jù)庫中數(shù)據(jù),需要后臺實(shí)現(xiàn)分頁贞瞒,傳入數(shù)據(jù)要有“頁碼page”跟“每頁數(shù)據(jù)條數(shù)nums”。
對應(yīng)SQL大概是這樣子:select * from mytbl order by id limit (page-1)*nums,nums
4.問題發(fā)現(xiàn):
在數(shù)據(jù)量不大或者是大數(shù)據(jù)量的前幾頁的時候棕洋,性能還算不壞,但是大數(shù)據(jù)量頁碼稍微大一點(diǎn)性能便下降比較嚴(yán)重掰盘。
5.問題分析:
原因出在Limit的偏移量offset上赞季,比如limit 100000,10雖然最后只返回10條數(shù)據(jù)愧捕,但是偏移量卻高達(dá)100000申钩,數(shù)據(jù)庫的操作其實(shí)是拿到100010數(shù)據(jù),然后返回最后10條撒遣。
那么解決思路就是,我能不能跳過100000條數(shù)據(jù)然后讀取10條禾进,而不是讀取100010條數(shù)據(jù)然后返回10條數(shù)據(jù)。
6.問題解決實(shí)現(xiàn):
原SQL語句如下:select *from mytbl order by id limit 100000,10
改進(jìn)后的SQL語句如下:
select *from mytbl where id>= (select id from mytbl order by id limit
100000,1) limit 10
注:假設(shè)id是主鍵索引命迈,那么里層走的是索引火的,外層也是走的索引,所以性能大大提高