MySQL 查詢優(yōu)化(九):分頁查詢優(yōu)化技巧

在有分頁查詢的應(yīng)用中,包括 LIMIT 和 OFFSET 的查詢十分常見宏赘,而且?guī)缀趺總€都會有一個 ORDER BY 子句。如果使用索引排序的話將對性能優(yōu)化十分有幫助黎侈,否則服務(wù)端需要做很多文件排序察署。

一個高頻的問題是 offset 的值過大。如果查詢類似 LIMIT 10000, 20峻汉,將會產(chǎn)生10020行箕母,并將之前的10000行丟棄,這樣的代價很高俱济。假設(shè)所有的頁使用相同的頻次訪問嘶是,這樣的查詢將平均掃描一半數(shù)據(jù)表。為了優(yōu)化他們蛛碌,你可以在分頁視圖中限制最多可訪問的頁數(shù)聂喇,或者讓大便宜的查詢更有效。

一個改善性能簡單的技巧是在覆蓋索引上進(jìn)行查詢操作而不是整行數(shù)據(jù)蔚携。你可以將結(jié)果與完整的行做一次聯(lián)合然后再獲取額外需要的列希太。這樣的效率會更高,例如下面的查詢:

SELECT film_id, description FROM sakila.film ORDER BY title LIMIT 50, 5;

如果數(shù)據(jù)表很大的話酝蜒,則可以按下面的方式進(jìn)行優(yōu)化:

SELECT film.film_id, film.description
FROM sakila.film
    INNER JOIN (
    SELECT film_id FROM sakila.film
    ORDER BY title LIMIT 50, 5)
  ) as lim USING(film_id);

這種“推斷聯(lián)合查詢”能夠有效工作是因?yàn)樗褂昧怂饕郎p少了服務(wù)端盡可能少地訪問數(shù)據(jù)行去檢查數(shù)據(jù)誊辉。一旦復(fù)核要求的行查到了,將他們與對應(yīng)的數(shù)據(jù)表的行進(jìn)行聯(lián)合查詢以獲取對應(yīng)行的其他列亡脑。

有些時候也可以將 limit 轉(zhuǎn)換為固定位置的查詢堕澄,這種方式可以對索引進(jìn)行范圍掃描完成。例如霉咨,如果你預(yù)先計(jì)算一個固定位置的列 稱之為 position蛙紫,可以重寫查詢?nèi)缦拢?/p>

SELECT film_id, description FROM sakila.film
WHERE position BETWEEN 50 AND 54 ORDER BY position;

排序的數(shù)據(jù)也可以使用類似的方式解決,但是通常會被 GROUP BY操作影響途戒。大部分情況下需要提前計(jì)算和存儲排序值坑傅。

LIMIT 和 OFFSET 真正的問題是在OFFSET,這意味著服務(wù)端會把很多數(shù)據(jù)行丟棄喷斋。如果使用一個有序書簽來記錄下次獲取行的位置的話唁毒,則可以從上次的位置開始訪問接下來的數(shù)據(jù)。例如星爪,如果你需要對出租記錄進(jìn)行分頁浆西,從最新的出租記錄開始往回查詢,則可以依賴于記錄的主鍵是一直增加的移必,因此可以對第一頁數(shù)據(jù)這樣查詢:

SELECT * FROM sakila.rental
ORDER BY rental_id DESC LIMIT 20;

這個查詢返回16049到16030之間的數(shù)據(jù)室谚。接下來的查詢可以從之前結(jié)束位置開始:

SELECT * FROM sakila.rental
WHERE rental_id < 16030 
ORDER BY rental_id DESC LIMIT 20;

這個技巧不管你從多遠(yuǎn)的偏移值開始查詢都是很有效的毡鉴。

其他的一些技巧包括使用預(yù)先計(jì)算的統(tǒng)計(jì)值崔泵,或者通過聯(lián)合冗余了主鍵和排序列的數(shù)據(jù)表進(jìn)行查詢秒赤,這兩種方式都是通過空間換取時間的方式提高查詢效率。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末憎瘸,一起剝皮案震驚了整個濱河市入篮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌幌甘,老刑警劉巖潮售,帶你破解...
    沈念sama閱讀 216,919評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異锅风,居然都是意外死亡酥诽,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,567評論 3 392
  • 文/潘曉璐 我一進(jìn)店門皱埠,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肮帐,“玉大人,你說我怎么就攤上這事边器⊙凳啵” “怎么了?”我有些...
    開封第一講書人閱讀 163,316評論 0 353
  • 文/不壞的土叔 我叫張陵忘巧,是天一觀的道長恒界。 經(jīng)常有香客問我,道長砚嘴,這世上最難降的妖魔是什么十酣? 我笑而不...
    開封第一講書人閱讀 58,294評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮际长,結(jié)果婚禮上婆誓,老公的妹妹穿的比我還像新娘。我一直安慰自己也颤,他們只是感情好洋幻,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,318評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著翅娶,像睡著了一般文留。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上竭沫,一...
    開封第一講書人閱讀 51,245評論 1 299
  • 那天燥翅,我揣著相機(jī)與錄音,去河邊找鬼蜕提。 笑死森书,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播凛膏,決...
    沈念sama閱讀 40,120評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼杨名,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了猖毫?” 一聲冷哼從身側(cè)響起台谍,我...
    開封第一講書人閱讀 38,964評論 0 275
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎吁断,沒想到半個月后趁蕊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,376評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡仔役,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,592評論 2 333
  • 正文 我和宋清朗相戀三年掷伙,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片又兵。...
    茶點(diǎn)故事閱讀 39,764評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡炎咖,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出寒波,到底是詐尸還是另有隱情乘盼,我是刑警寧澤,帶...
    沈念sama閱讀 35,460評論 5 344
  • 正文 年R本政府宣布俄烁,位于F島的核電站绸栅,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏页屠。R本人自食惡果不足惜粹胯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,070評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望辰企。 院中可真熱鬧风纠,春花似錦、人聲如沸牢贸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,697評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽潜索。三九已至臭增,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間竹习,已是汗流浹背誊抛。 一陣腳步聲響...
    開封第一講書人閱讀 32,846評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留整陌,地道東北人拗窃。 一個月前我還...
    沈念sama閱讀 47,819評論 2 370
  • 正文 我出身青樓瞎领,卻偏偏與公主長得像,于是被迫代替她去往敵國和親随夸。 傳聞我的和親對象是個殘疾皇子九默,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,665評論 2 354

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