欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

高效的mysql分頁方法及原理

 更新時間:2013年08月22日 15:57:19   作者:  
這篇文章介紹了高效的mysql分頁方法及原理,有需要的朋友可以參考一下

首先看一下分頁的基本原理:

復(fù)制代碼 代碼如下:

mysql> explain SELECT * FROM message ORDER BY id DESC LIMIT 10000, 20G ***************** 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)


limit 10000,20的意思掃描滿足條件的10020行,扔掉前面的10000行,返回最后的20行,問題就在這里,如果是limit 100000,100,需要掃描100100行,在一個高并發(fā)的應(yīng)用里,每次查詢需要掃描超過10W行,性能肯定大打折扣。文中還提到limit n性能是沒問題的,因為只掃描n行。

文中提到一種”clue”的做法,給翻頁提供一些”線索”,比如還是SELECT * FROM message ORDER BY id DESC,按id降序分頁,每頁20條,當(dāng)前是第10頁,當(dāng)前頁條目id最大的是9527,最小的是9500,如果我們只提供”上一頁”、”下一頁”這樣的跳轉(zhuǎn)(不提供到第N頁的跳轉(zhuǎn)),那么在處理”上一頁”的時候SQL語句可以是:

復(fù)制代碼 代碼如下:

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

處理”下一頁”的時候SQL語句可以是:

復(fù)制代碼 代碼如下:

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

不管翻多少頁,每次查詢只掃描20行。

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

如果LIMIT m,n不可避免的話,要優(yōu)化效率,只有盡可能的讓m小一下,我們擴展前面的”clue”做法,還是SELECT * FROM message ORDER BY id DESC,按id降序分頁,每頁20條,當(dāng)前是第10頁,當(dāng)前頁條目id最大的是9527,最小的是9500,比如要跳到第8頁,我看的SQL語句可以這樣寫:

復(fù)制代碼 代碼如下:

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

跳轉(zhuǎn)到第13頁:
復(fù)制代碼 代碼如下:

SELECT * FROM message WHERE id < 9500 ORDER BY id DESC LIMIT 40,20;

原理還是一樣,記錄住當(dāng)前頁id的最大值和最小值,計算跳轉(zhuǎn)頁面和當(dāng)前頁相對偏移,由于頁面相近,這個偏移量不會很大,這樣的話m值相對較小,大大減少掃描的行數(shù)。其實傳統(tǒng)的limit m,n,相對的偏移一直是第一頁,這樣的話越翻到后面,效率越差,而上面給出的方法就沒有這樣的問題。

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

已在60W數(shù)據(jù)總量的表中測試,效果非常明顯。

相關(guān)文章

  • 一文教你學(xué)會定位線上MySQL鎖超時問題

    一文教你學(xué)會定位線上MySQL鎖超時問題

    這篇文章主要介紹了一文教你學(xué)會定位線上MySQL鎖超時問題,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的小伙伴可以參考一下
    2022-08-08
  • mysql查詢今天、昨天、近7天、近30天、本月、上一月的SQL語句

    mysql查詢今天、昨天、近7天、近30天、本月、上一月的SQL語句

    這篇文章主要介紹了mysql查詢今天、昨天、近7天、近30天、本月、上一月的SQL語句,一般在一些統(tǒng)計報表中比較常用這個時間段,需要的朋友可以參考下
    2014-06-06
  • MYSQL神秘的HANDLER命令與實現(xiàn)方法

    MYSQL神秘的HANDLER命令與實現(xiàn)方法

    這篇文章主要介紹了MYSQL神秘的HANDLER命令與實現(xiàn)方法,需要的朋友可以參考下
    2016-07-07
  • MySQL查看和修改字符編碼的實現(xiàn)方法

    MySQL查看和修改字符編碼的實現(xiàn)方法

    下面小編就為大家?guī)硪黄狹ySQL查看和修改字符編碼的實現(xiàn)方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • MySQL 語句執(zhí)行順序舉例解析

    MySQL 語句執(zhí)行順序舉例解析

    這篇文章主要介紹了MySQL 語句執(zhí)行順序舉例解析,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值需要的小伙伴可以參考一下
    2022-06-06
  • MySQL如何利用存儲過程快速生成100萬條數(shù)據(jù)詳解

    MySQL如何利用存儲過程快速生成100萬條數(shù)據(jù)詳解

    在MySQL數(shù)據(jù)庫中,如果要插入上百萬級的記錄,用普通的insertinto來操作非常不現(xiàn)實,速度慢人力成本高,這篇文章主要給大家介紹了關(guān)于MySQL如何利用存儲過程快速生成100萬條數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • mysql5.0版本下載地址集合

    mysql5.0版本下載地址集合

    mysql5.0版本是比較經(jīng)典的版本,這個版本對大多數(shù)的cms支持比較好,但官方網(wǎng)站不容易找到下載地址,這里特整理下,方便需要mysql5.0的朋友
    2013-06-06
  • Mysql中正則表達式Regexp常見用法

    Mysql中正則表達式Regexp常見用法

    這篇文章主要介紹了Mysql中正則表達式Regexp常見用法,MySql REGEXP運算符匹配字符串,mysql正則REGEXP學(xué)習(xí)練習(xí)筆記,需要的朋友可以參考下
    2020-02-02
  • 從 MySQL源碼分析網(wǎng)絡(luò)IO模型

    從 MySQL源碼分析網(wǎng)絡(luò)IO模型

    這篇文章主要為大家介紹了從 MySQL源碼分析網(wǎng)絡(luò)IO模型,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-06-06
  • mysql如何獲取時間整點

    mysql如何獲取時間整點

    這篇文章主要介紹了mysql如何獲取時間整點問題,具有很好的的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-02-02

最新評論