1. 程式人生 > >資料庫面試:分頁查詢的SQL寫法

資料庫面試:分頁查詢的SQL寫法

    分頁是很多網站應用或管理系統比較常見的需要實現的需求,是相關開發同學常碰到的需要寫的查詢。開發面試中會不會被問到用SQL寫分頁,因為個人不是開發,就不得而知了。在之前自己參加的資料庫崗位的面試中,被問到用SQL寫分頁,所以這裡記錄一下。

SELECT t.`columnA`, t.`columnB`, t.`columnC`
FROM `table` AS t
ORDER BY t.`column` /* usually primary key or timestamp key column */ DESC
LIMIT {page_row} /* rows per page */
OFFSET {page_off} /* offsets per page := {page_row} * ({page_num} - 1) */
;

    一句很簡單的SELECT查詢。實際應用中比較常見的需求是按照時間順序由最近開始往前查詢然後分頁,所以一般是以一個時間戳`column`來DESC降序ORDER BY。LIMIT後面的{page_row}是每頁包含多少條記錄,這個一般是個固定大小的引數,由外部傳入。OFFSET後面的{page_off}是查詢時每頁的偏移量,可以簡單地通過頁記錄數{page_row}和頁號碼{page_num}遞推出來:{page_row} * ({page_num} - 1)。

    其實作為資料庫崗位來說,更多的工作是放在該查詢的效能方面,最主要的是查詢中的ORDER BY欄位有索引可用。如果需要返回的欄位較少而且可控,可以考慮將排序欄位和返回欄位建一個組合索引,這樣只查詢索引頁,節省潛在的磁碟I/O和記憶體佔用。在InnoDB儲存引擎中,由於是索引組織表,即記錄的寫入本身就是以其插入的次序先後排序的,所以主鍵欄位可以扮演時間戳欄位用以排序的角色。因此,如果不存在資料斷裂(記錄行有被物理刪除或者邏輯刪除過),根據實際情況也可以取用主鍵欄位代替時間戳欄位來作為分頁的排序依據。