場景
假設我們採用分表的方案存儲了用戶註冊信息,分表方案為:
表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頁之後的數據,這要取決於搜索引擎的排序算法。
閱讀更多 蝸牛zzZ 的文章
關鍵字: ElasticSearch 分頁 搜索引擎