SQL limit與offset

SQL limit與offset

select * from table limit 2,1;
-- 含義是跳過2條取一條數(shù)據(jù),limit后面是從第二條開始讀书妻,讀取1條信息啼县,即讀取第三條數(shù)據(jù)

select * from table limit 2 offset 1
-- 含義是從第一條(不包括)數(shù)據(jù)開始取出2條數(shù)據(jù)衰絮,limit后面跟的是2條數(shù)據(jù)凝赛,offset后面是從第一條開始讀取注暗,即讀取2,3條

使用查詢語句的時(shí)候墓猎,經(jīng)常要返回前幾條或者中間的某幾行數(shù)據(jù)捆昏,這個(gè)時(shí)候怎么辦呢?

limit子句可以用于強(qiáng)制select語句返回指定的記錄數(shù)毙沾。limit接受一個(gè)或兩個(gè)數(shù)字參數(shù)骗卜。參數(shù)必須是一個(gè)整數(shù)常量。

如果給定兩個(gè)參數(shù)左胞,第一個(gè)參數(shù)指定第一個(gè)返回記錄行的偏移量寇仓,第二個(gè)參數(shù)指定返回記錄行的最大數(shù)目。

select * from table limit 3,7 
-- 返回4-11行 
select * from table limit 3,1
-- 返回第四行
select * from table limit 3
-- 返回前三行

以前我在mysql中分頁都是用的 limit 100000,20這樣的方式罩句,我相信你也是吧焚刺,但是要提高效率敛摘,讓分頁的代碼效率更高一些镰吆,更快一些,那我們又該怎么做呢?

第一部分:看一下分頁的基本原理:

mysql explain SELECT * FROM message ORDER BY id DESC LIMIT 10000, 20
***************** 1. row **************
id: 1
select_type: SIMPLE
table: message
type: index
possible_keys: NULL
key: PRIMARY
key_len: 4
ref: NULL
rows: 10020
Extra:
1 row in set (0.00 sec)

對(duì)上面的mysql語句說明:limit 10000,20的意思掃描滿足條件的10020行拴孤,扔掉前面的10000行,返回最后的20行,問題就在這里矛辕,如果是limit 100000,100,需要掃描100100行纺裁,在一個(gè)高并發(fā)的應(yīng)用里祟身,每次查詢需要掃描超過10W行,性能肯定大打折扣泄私。文中還提到limit n性能是沒問題的房揭,因?yàn)橹粧呙鑞行。

第二部分:根據(jù)雅虎的幾位工程師帶來了一篇Efficient Pagination Using MySQL的報(bào)告內(nèi)容擴(kuò)展:在文中提到一種clue的做法晌端,給翻頁提供一些線索捅暴,比如還是SELECT * FROM message ORDER BY id DESC,按id降序分頁咧纠,每頁20條蓬痒,當(dāng)前是第10頁,當(dāng)前頁條目id最大的是1020漆羔,最小的是1000梧奢,如果我們只提供上一頁狱掂、下一頁這樣的跳轉(zhuǎn)(不提供到第N頁的跳轉(zhuǎn)),那么在處理上一頁的時(shí)候SQL語句可以是:

SELECT * FROM message WHERE id>1020 ORDER BY id ASC LIMIT 20;

處理下一頁的時(shí)候SQL語句可以是:

SELECT * FROM message WHERE id<1000 ORDER BY id DESC LIMIT 20;

缺點(diǎn)是只能提供上一頁亲轨、下一頁的鏈接形式趋惨,但是我們的產(chǎn)品經(jīng)理非常喜歡“上一頁 1 2 3 4 5 6 7 8 9 下一頁”這樣的鏈接方式,怎么辦呢惦蚊?

如果LIMIT m,n不可避免的話希柿,要優(yōu)化效率,只有盡可能的讓m小一下养筒,我們擴(kuò)展前面的clue做法曾撤,還是SELECT * FROM message ORDER BY id DESC,按id降序分頁晕粪,每頁20條挤悉,當(dāng)前是第10頁,當(dāng)前頁條目id最大的是2519巫湘,最小的是2500;

當(dāng)是第10頁的SQL如下:

SELECT * FROM tb_goods_info WHERE auto_id >=2500 ORDER BY auto_id ASC LIMIT 0,20

比如要跳到第9頁装悲,SQL語句可以這樣寫:

SELECT * FROM tb_goods_info WHERE auto_id <2500 ORDER BY auto_id desc LIMIT 0,20

比如要跳到第8頁,SQL語句可以這樣寫:

SELECT * FROM tb_goods_info WHERE auto_id <2500 ORDER BY auto_id desc LIMIT 20,20

跳轉(zhuǎn)到第11頁:

SELECT * FROM tb_goods_info WHERE auto_id >2519 ORDER BY auto_id asc LIMIT 0,20

跳轉(zhuǎn)到第13頁:

SELECT * FROM tb_goods_info WHERE auto_id >2519 ORDER BY auto_id asc LIMIT 40,20

原理還是一樣尚氛,記錄住當(dāng)前頁id的最大值和最小值诀诊,計(jì)算跳轉(zhuǎn)頁面和當(dāng)前頁相對(duì)偏移,由于頁面相近阅嘶,這個(gè)偏移量不會(huì)很大属瓣,這樣的話m值相對(duì)較小,大大減少掃描的行數(shù)讯柔。其實(shí)傳統(tǒng)的limit m,n抡蛙,相對(duì)的偏移一直是第一頁,這樣的話越翻到后面魂迄,效率越差粗截,而上面給出的方法就沒有這樣的問題。

注意SQL語句里面的ASC和DESC捣炬,如果是ASC取出來的結(jié)果熊昌,顯示的時(shí)候記得倒置一下。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末湿酸,一起剝皮案震驚了整個(gè)濱河市婿屹,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌稿械,老刑警劉巖选泻,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡页眯,警方通過查閱死者的電腦和手機(jī)梯捕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來窝撵,“玉大人傀顾,你說我怎么就攤上這事÷捣睿” “怎么了短曾?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長赐劣。 經(jīng)常有香客問我嫉拐,道長,這世上最難降的妖魔是什么魁兼? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任婉徘,我火速辦了婚禮,結(jié)果婚禮上咐汞,老公的妹妹穿的比我還像新娘盖呼。我一直安慰自己,他們只是感情好化撕,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布几晤。 她就那樣靜靜地躺著,像睡著了一般植阴。 火紅的嫁衣襯著肌膚如雪蟹瘾。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天墙贱,我揣著相機(jī)與錄音热芹,去河邊找鬼。 笑死惨撇,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的府寒。 我是一名探鬼主播魁衙,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼株搔!你這毒婦竟也來了剖淀?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對(duì)情侶失蹤纤房,失蹤者是張志新(化名)和其女友劉穎纵隔,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡捌刮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年碰煌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片绅作。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡芦圾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出俄认,到底是詐尸還是另有隱情个少,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布眯杏,位于F島的核電站夜焦,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏岂贩。R本人自食惡果不足惜糊探,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望河闰。 院中可真熱鬧科平,春花似錦、人聲如沸姜性。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽部念。三九已至弃酌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間儡炼,已是汗流浹背妓湘。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留乌询,地道東北人榜贴。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像妹田,于是被迫代替她去往敵國和親唬党。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容