前言
日常開發中,我們使用mysql來實現分頁功能的時候,總是會用到mysql的limit語法.而怎麼使用卻很有講究的,今天來總結一下.
limit語法
limit語法支援兩個引數,offset和limit,前者表示偏移量,後者表示取前limit條資料.
例如:## 返回符合條件的前10條語句
select * from user limit 10
## 返回符合條件的第11-20條資料
select * from user limit 10,20
從上面也可以看出來,limit n 等價於limit 0,n.
效能分析
實pslzagi際使用中我們會發現,在分頁的後面一些頁,載入會變慢,也就是說:
select * from user limit 1000000,10
語句執行較慢.那麼我們首先來測試一下.
首先是在offset較小的情況下拿100條資料.(資料總量為200左右).然後逐漸增大offset.
select * from user limit 0,100 ---------耗時0.03s
select * from user limit 10000,100 ---------耗時0.05s
select * from user limit 100000,100 ---------耗時0.13s
select * from user limit 500000,100 ---------耗時0.23s
select * from user limit 1000000,100 ---------耗時0.50s
select * from user limit 1800000,100 ---------耗時0.98s
可以看到隨著offset的增大,效能越來越差.
這是為什www.cppcns.com麼呢?因為limit 10000,10的語法實際上是mysql查詢到前10010條資料,之後丟棄前面的10000行程式設計客棧,這個步驟其實是浪費掉的.
優化用id優化
先找到上次分頁的最大id,然後利用id上的索引來查詢,類似於select * from user where id>1000000 limit 100.
這樣的效率非常快,因為主鍵上是有索引的,但是這樣有個缺點,就是id必須是連續的,並且查詢不能有where語句,因為where語句會造成過濾資料.
用覆蓋索引優化
mysql的查詢完全命中索引的時候,稱為覆蓋索引,是非常快的,因為查詢只需要在索引上進行查詢,之後可以直接返回,而不用再回資料表拿資料.因此我們可以先查出索引的id,然後根據id拿資料.
select * from (select id from job limit 1000000,100) a left join job b on a.id = b.id;
www.cppcns.com耗時0.2秒.
總結用mysql做大量資料的分頁確實是有難度,但是也有一些方法可以進行優化,需要結合業務場景多進行測試.
當使用者翻到10000頁的時候,不如我們直接返回空好了,這麼無聊的嗎...
本文標題: mysql limit使用方法以及超大分頁問題解決
本文位址:
centos下selenium使用方法以及報錯處理
用下面的命令安裝google chrome 複製1 yum install 複製1 wget 複製1 yum install google chrome stable current x86 64.rpm 安裝必要的庫 複製1 yum install mesa libosmesa devel gnu...
pythonpip使用方法 pip使用方法整理
匯出專案已安裝的pip包 pip list 檢視專案中安裝的包 pip freeze requirements.txt 將專案中所用到的第三方庫輸出到requirements.txt中 pip install 版本號 pip install i 本次使用清華源進行安裝 離線安裝第三方庫 一鍵安裝整個...
python反射。以str對映 從而使用方法
目前,method是另乙個檔案裡的方法名,我不知道它的方法名,我已經有辦法得到method了,呼叫的時候出錯。它無法將字串作為乙個方法 即使相同名稱的也不可以 此時就要使用到python的反射,getattr 嗯,好像就是先載入這個類,然後獲取到它的構造,裡面好像有個對映,方法名對映真正的方法。然後...