Mysql分頁(yè)&關(guān)聯(lián)查詢優(yōu)化

以下內(nèi)容參考《高性能Mysql》

優(yōu)化關(guān)聯(lián)查詢

這個(gè)話題基本上整本書都在討論,這里需要特別提到的是:

  • 確保ON或者USING子句中的列上有索引。在創(chuàng)建索引的時(shí)候就要考慮到關(guān)聯(lián)的順序。
    當(dāng)表A和表B用列c關(guān)聯(lián)的時(shí)候,如果優(yōu)化器的關(guān)聯(lián)順序是B、A,那么就不需要在
    B表的對(duì)應(yīng)列上建上索引。沒有用到的索引只會(huì)帶來(lái)額外的負(fù)擔(dān)。一般來(lái)說(shuō),除非
    有其他理由,否則只需要在關(guān)聯(lián)順序中的第二個(gè)表的相應(yīng)列上創(chuàng)建索引。
  • 確保任何的GROUP BY和ORDER BY中的表達(dá)式只涉及到一個(gè)表中的列,這樣MySQL
    才有可能使用索引來(lái)優(yōu)化這個(gè)過(guò)程。
  • 當(dāng)升級(jí)MySQL的時(shí)候需要注意:關(guān)聯(lián)語(yǔ)法、運(yùn)算符優(yōu)先級(jí)等其他可能會(huì)發(fā)生變化
    的地方。因?yàn)橐郧笆瞧胀P(guān)聯(lián)的地方可能會(huì)變成笛卡兒積,不同類型的關(guān)聯(lián)可能會(huì)
    生成不同的結(jié)果

優(yōu)化LIMIT分頁(yè)

在系統(tǒng)中需要進(jìn)行分頁(yè)操作的時(shí)候,我們通常會(huì)使用LIMIT加上偏移量的辦法實(shí)現(xiàn),同
時(shí)加上合適的ORDER BY子句。如果有對(duì)應(yīng)的索引,通常效率會(huì)不錯(cuò),否則,MySQL需
要做大量的文件排序操作。

一個(gè)非常常見又令人頭疼的問題就是,在偏移量非常大的時(shí)候注”,例如可能是LIMIT
1000,20這樣的查詢,這時(shí)MySQL需要查詢1 0 020條記錄然后只返回最后20條,前面
10 000條記錄都將被拋棄,這樣的代價(jià)非常高。如果所有的頁(yè)面被訪問的頻率都相同,
那么這樣的查詢平均需要訪問半個(gè)表的數(shù)據(jù)。要優(yōu)化這種查詢,要么是在頁(yè)面中限制分
頁(yè)的數(shù)量,要么是優(yōu)化大偏移量的性能。

優(yōu)化此類分頁(yè)查詢的一個(gè)最簡(jiǎn)單的辦法就是盡可能地使用索引覆蓋掃描,而不是查詢所
有的列。然后根據(jù)需要做一次關(guān)聯(lián)操作再返回所需的列。對(duì)于偏移量很大的時(shí)候,這樣
做的效率會(huì)提升非常大。考慮下面的查詢:

mysql> SELECT film_id,description FROM sakila.film ORDER BY title LIHIT 50,5;

如果這個(gè)表非常大,那么這個(gè)查詢最好改寫成下面的樣子:

mysql> SELECT film.film_id,Film.description
    ->  FROM  sakila.film
    ->INNER JOIN(
    ->  SELECT film.film_id FROM sakila.film
    ->  ORDER BY title LIMIT 50,5
    ->) AS lim USING(film_id);

這里的“延遲關(guān)聯(lián)”將大大提升查詢效率,它讓MySQL掃描盡可能少的頁(yè)面,獲取需
要訪問的記錄后再根據(jù)關(guān)聯(lián)列回原表查詢需要的所有列。這個(gè)技術(shù)也可以用于優(yōu)化關(guān)聯(lián)
查詢中的LIMIT子句。

有時(shí)候也可以將LIMIT查詢轉(zhuǎn)換為已知位置的查詢,讓MySQL通過(guò)范圍掃描獲得到對(duì)
應(yīng)的結(jié)果。例如,如果在一個(gè)位置列上有索引,并且預(yù)先計(jì)算出了邊界值,上面的查詢
就可以改寫為:

mysql> SELECT film_id, description FROM sakila.Film
       -> WHERE position BETWEEN so AND 54 0RDER BY position;

對(duì)數(shù)據(jù)進(jìn)行排名的問題也與此類似,但往往還會(huì)同時(shí)和GROUP BY混合使用。在這種情況
下通常都需要預(yù)先計(jì)算并存儲(chǔ)排名信息。

LIMIT和OFFST的問題,其實(shí)是OFFSET的問題.它會(huì)導(dǎo)致MySQL掃描大量不需要的
行然后再拋棄掉。如果可以使用書簽記錄上次取數(shù)據(jù)的位置,那么下次就可以直接從該
書簽記錄的位置開始掃描,這樣就可以避免使用OFFSET。例如,若需要按照租借記錄做
翻頁(yè),那么可以根據(jù)最新一條租借記錄向后追溯,這種做法可行是因?yàn)樽饨栌涗浀闹麈I
是單調(diào)增長(zhǎng)的。首先使用下面的查詢獲得第一組結(jié)果:

mysql> SELECT * FROM sakila.rental
      -> ORDER BY rental id DESC LIMIT 20;

假設(shè)上面的查詢返回的是主鍵為1 6 049到1 6 03 0的租借記錄,那么下一頁(yè)查詢就可以
從1 6 030這個(gè)點(diǎn)開始:

mysql> SELECT * FROM sakila*rental
    -> WHERE rental id < 16030,
    -> ORDER BY rental id DESC LIMIT 20;

該技術(shù)的好處是無(wú)論翻頁(yè)到多么后面,其性能都會(huì)很好。
其他優(yōu)化辦法還包括使用預(yù)先計(jì)算的匯總表,或者關(guān)聯(lián)到一個(gè)冗余表,冗余表只包含主
鍵列和需要做排序的數(shù)據(jù)列。還可以使用Sphinx優(yōu)化一些搜索操作,參考附錄F可以獲
得更多相關(guān)信息。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,565評(píng)論 6 539
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,115評(píng)論 3 423
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 177,577評(píng)論 0 382
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,514評(píng)論 1 316
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,234評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,621評(píng)論 1 326
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,641評(píng)論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,822評(píng)論 0 289
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,380評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,128評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,319評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,879評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,548評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,970評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,229評(píng)論 1 291
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,048評(píng)論 3 397
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,285評(píng)論 2 376

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

  • 國(guó)慶第二天,今天嗨翻模式的開啟就等室友的同學(xué)來(lái)了再說(shuō)吧,在這之前,先來(lái)一波筆記 查詢真正重要的是響應(yīng)時(shí)間,查詢包含...
    小煉君閱讀 1,731評(píng)論 0 50
  • mysql性能優(yōu)化-慢查詢分析、優(yōu)化索引和配置 分類:Mysql/postgreSQL 目錄 一、優(yōu)化概述 二、查...
    CaesarXia閱讀 2,999評(píng)論 1 46
  • 如今隨著互聯(lián)網(wǎng)的發(fā)展,數(shù)據(jù)的量級(jí)也是撐指數(shù)的增長(zhǎng),從GB到TB到PB。對(duì)數(shù)據(jù)的各種操作也是愈加的困難,傳統(tǒng)的關(guān)系性...
    CaesarXia閱讀 11,861評(píng)論 1 30
  • MySQL不權(quán)威總結(jié) 歡迎閱讀 本文并非事無(wú)巨細(xì)的mysql學(xué)習(xí)資料,而是選擇其中重要、困難、易錯(cuò)的部分進(jìn)行系統(tǒng)地...
    liufxlucky365閱讀 2,613評(píng)論 0 26
  • 把這兩天總結(jié)一下吧。 23號(hào)晚上去了某互聯(lián)網(wǎng)公司筆試,看隔壁某快捷酒店宣講覺得不錯(cuò)也投了。兩天下來(lái),無(wú)領(lǐng)導(dǎo)、單面、...
    夏齁咸閱讀 144評(píng)論 1 2