05.26 如何進行誇庫數據分頁

場景

假設我們採用分表的方案存儲了用戶註冊信息,分表方案為:

表ID = 用戶ID % 10

那麼我們的用戶數據就會存儲在10個表中

如果PM來了一個需求,需要根據註冊時間分頁展示用戶註冊信息,怎麼實現?

解決方案一:分頁大致有序

如果一頁展示20條數據,那麼我們可以在每個分表中查詢2條數據,然後在代碼中將數據合併到一起。然後排序,返回給前端。

這種方案實現簡單,但是2個分頁中,數據不一定完全有序。

解決方案二:分頁嚴格有序

查詢第一頁的時候,我們在每個分表中查詢10條記錄

SELECT * FROM user_%d ORDER BY `id` DESC LIMIT 0, 10

然後將10個表中的數據進行合併排序,取前10條數據,然後記錄下第10條數據的id,一併返回給前段,返回數據大致如下:

{

"total": 100000,

"list": [{}, {}, {}, ...., {}],

"ext": {

"id": 10, //list中最大的id

}

}

查詢第二頁的時候,前端將ext信息一併傳入後端,後端再每個分表查庫,查詢語句如下:

SELECT * FROM user_%d WHERE `id` > {ext.id} ORDER BY `id` LIMIT 10, 10

查詢第三頁第四頁以此類推

這樣的話就能保證查出來的數據嚴格有序。

解決方案三:搜索引擎

另外的話我們可以把數據導入到搜索引擎,例如elasticsearch,通過elasticsearch完成查詢。但是搜索引擎不能保證所有的數據都被查出來,特別是100頁之後的數據,這要取決於搜索引擎的排序算法。


分享到:


相關文章: