1. 程式人生 > >【MySQL】常見的業務處理-分頁顯示

【MySQL】常見的業務處理-分頁顯示

介紹

分頁在我們日常開發中是非常常見的需求,我們通常會用LIMIT加上偏移量的辦法實現。但是大家有沒有考慮過當偏移量大的時候分頁SQL的執行效率呢?下面以一個例子來模擬優化的過程。

業務需求

有一個商品評論表結構如下: 要求查詢出某一個商品的前10條評論。 我們寫出的SQL可能會是這個樣子:

對SQL進行優化

使用EXPLAIN進行分析:
建立聯合索引: 建立組合索引的時候,區分度最高的在左邊。有一個例外就是存在非等號和等號混合判斷條件時,在建立索引的時候,把等號條件的列前置。如where a>? and b=? 那麼即使a的區分度更高,也必須把b放在索引的最前列。

目前資料庫沒有資料,如果有資料可以根據索引的區分度來選擇優先順序。同時要注意上面提到的非等號和等號混合判斷條件的問題。 建立聯合索引後對SQL進行一次分析,可以看到type由ALL變成ref:
問題的關鍵在於:MySQL並不是跳過offset(偏移量)行,而是取offset+N行,然後返回放棄錢offset行,返回N行, 假如offset特別大的時候效率就特別低下。 接下來對SQL語句的結構進行優化:


還可以這樣寫:
這樣讓MySQL掃描了更少的頁面,獲取要訪問的記錄後再根據關聯列回表查詢關聯的列。將隨機I/O變成了順序I/O。