1. 程式人生 > 程式設計 >MySQL的limit使用及解決超大分頁問題

MySQL的limit使用及解決超大分頁問題

前言

日常開發中,我們使用mysql來實現分頁功能的時候,總是會用到mysql的limit語法.而怎麼使用卻很有講究的,今天來總結一下.

limit語法

limit語法支援兩個引數,offsetlimit,前者表示偏移量,後者表示取前limit條資料.

例如:


## 返回符合條件的前10條語句 
select * from user limit 10

## 返回符合條件的第11-20條資料
select * from user limit 10,20
複製程式碼

從上面也可以看出來,limit n 等價於limit 0,n

.

效能分析

實際使用中我們會發現,在分頁的後面一些頁,載入會變慢,也就是說:

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的增大,效能越來越差.

這是為什麼呢?因為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;
複製程式碼

耗時0.2秒.

總結

用mysql做大量資料的分頁確實是有難度,但是也有一些方法可以進行優化,需要結合業務場景多進行測試.

當使用者翻到10000頁的時候,不如我們直接返回空好了,這麼無聊的嗎...


完。



ChangeLog

2019-05-25 完成

**以上皆為個人所思所得,如有錯誤歡迎評論區指正。**

歡迎轉載,煩請署名並保留原文連結。

聯絡郵箱:[email protected]

更多學習筆記見個人部落格------>呼延十