使用MySQL實現分頁查詢

寫在前面:博主是一只經過實戰開發歷練後投身培訓事業的“小山豬”,暱稱取自動畫片《獅子王》中的“彭彭”,總是以樂觀、積極的心態對待周邊的事物。本人的技術路線從Java全棧工程師一路奔向大數據開發、數據挖掘領域,如今終有小成,願將昔日所獲與大家交流一二,希望對學習路上的你有所助益。同時,博主也想通過此次嘗試打造一個完善的技術圖書館,任何與文章技術點有關的異常、錯誤、注意事項均會在末尾列出,歡迎大家通過各種方式提供素材。

  • 對於文章中出現的任何錯誤請大家批評指出,一定及時修改。
  • 有任何想要討論和學習的問題可聯繫我:[email protected]
  • 發佈文章的風格因專欄而異,均自成體系,不足之處請大家指正。

使用MySQL實現分頁查詢

本文關鍵字:MySQL、分頁查詢、真分頁、假分頁、LIMIT


在項目開發當中,經常要實現分頁功能,在面試時也會經常被問到,什麼是分頁。這是因爲在一個頁面上能夠顯示的數據是有限的,而存放在數據庫中的數據往往很多,我們必須將這些數據安放到不同的頁面中去。

一、分頁

1. 什麼是分頁

一般在客戶端實現分頁功能的時候,要顯示當前頁的數據、當前所在頁數、臨近頁面的按鈕以及總頁數等等。這些數據隨着翻頁的進行能夠動態的變化,爲了實現這樣的效果,一般會採取兩種辦法:真分頁假分頁。這樣的劃分方式是從與數據庫的交互方式出發的,是每次翻頁時都進行查詢還是一次性查出所有的數據。

2. 真分頁

真分頁指的是每次在進行翻頁時都只查詢出當前頁面的數據,特點就是與數據庫的交互次數較多,但是每次查詢的數據量較少,數據也不需要一直保存在內存中。適用於數據量比較大的場景,數據不適合全量查出的情況。

3. 假分頁

假分頁指的是對於要顯示的數據一次性全部查出,一直存在在服務端或客戶端,在前端進行分頁或由服務端控制分頁。將根據當前所在頁來計算應該顯示的數據所在下標,用循環取出目標數據。只有當會話斷開或頁面關閉,相應的資源纔會被釋放。

4. 緩存層

真分頁和假分頁都要和數據庫進行交互,對於真分頁來說不需要擔心數據同步的問題,因爲每次都是查詢出最新的,但是數據庫的負擔會很重,尤其是用戶量大的情況下。
假分頁可以在一定程度上減輕數據庫的壓力,但是數據不能及時得到同步,除非重新請求或頁面刷新。
一般在企業中會有緩存層的存在,既能有效降低數據庫的壓力,又能及時的進行數據同步。在對數據庫中的數據進行修改後,要將變更後的數據及時同步到緩存層,在進行數據查詢時從緩存層獲取。

二、MySQL實現分頁

本文將介紹如何通過真分頁的方式,每次取出所需數據。對於不同的數據,實現分頁有不同的方式,在MySQL中可以使用LIMIT來限制查詢出的數據。

1. LIMIT用法

LIMIT出現在查詢語句的最後,可以使用一個參數或兩個參數來限制取出的數據。其中第一個參數代表偏移量:offset(可選參數),第二個參數代表取出的數據條數:rows。

  • 單參數用法

當指定一個參數時,默認省略了偏移量,即偏移量爲0,從第一行數據開始取,一共取rows條。

/* 查詢前5條數據 */
SELECT * FROM Student LIMIT 5;
  • 雙參數用法

當指定兩個參數時,需要注意偏移量的取值是從0開始的,此時可以有兩種寫法:

/* 查詢第1-10條數據 */
SELECT * FROM Student LIMIT 0,10;
/* 查詢第11-20條數據 */
SELECT * FROM Student LIMIT 10 OFFSET 10;

2. 分頁公式

  • 總頁數計算

在進行分頁之前,我們需要先根據數據總量來得出總頁數,這需要用到COUNT函數和向上取整函數CEIL,SQL如下:

/* 獲得數據總條數 */
SELECT COUNT(*) FROM Student;
/* 假設每頁顯示10條,則直接進行除法運算,然後向上取整 */
SELECT CEIL(COUNT(*) / 10) AS pageTotal FROM Student;
  • 核心信息
    • 當前頁:pageNumber
    • 每頁數據量:pageSize

在實際操作中,我們能夠得到的信息有當前所在頁以及每頁的數據量,同時要注意一下是否超出了最大頁數。以每頁10條爲例,則前三頁的數據應爲:

  • 第1頁:第1~10條,SQL寫法:LIMIT 0,10
  • 第2頁:第11~20條,SQL寫法:LIMIT 10,10
  • 第3頁:第21~30條,SQL寫法:LIMIT 20,10

據此我們可以總結出,LIMIT所需要的兩個參數計算公式如下:

  • offset:(pageNumber - 1) * pageSize
  • rows:pageSize
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章