備份表多表分頁查詢方法
問題產生背景:
項目當中有個表數據量很大,超過幾千萬的數據存儲,數據如果存儲在單表上,查詢、插入和清理(delete)的效率非常低下,打算進行改造。分析下 來可以采用數據庫大表存儲方案和分表存儲方案,考慮到數據庫的通用性,最后采用分表存儲。分表存儲是非常簡單的,達到一定時間后創建相同的新表進行存儲就 行了。但這樣分表后產生了一個新問題的,如何進行多表的分頁?
關于多表分頁查詢要解決的問題:
如何像單表一樣進行多表的查詢?
首先我們先來看看單表查詢如何來做,mysql為例。
假如有一張表的數據結構如下:
表名:testuser
單表分頁查詢:select * from testuser limit 0,2
解釋:查詢testuser表從0開始,2條記錄
創建一個新的相同的表:testuser_02
多表查詢的話需要將多個表的數據集合并起來,這里需要用到union all方法。
注意:union也可以,但是union會比較排除相同字段而union all不會進行比較,因此合并的時候union效率較低。
多表分頁語句:(select * from testuser) union all (select * from testuser_02) limit 0,2
解釋:查詢testuser數據,查詢testuser_02數據,然后進行合并,合并后取行數0開始的2條記錄
如果需要添加where字句的話只要在每個表查詢中添加相應的語句即可。
分表的效率問題?
我們看到上面的分表分頁雖然是成功的,但是當表的數據變大的時候,查詢速度明顯下降。
我們將testuser和testuser_02的數據量提升到64w條和8w條。
同樣的sql語句查詢速度:
我們看到需要1.81秒,明顯速度變慢,如果數據量越來越大,則會更慢。
調整查詢語句,在每個sql中添加分頁,最終再進行分頁:
(select * from testuser limit 0,2) union all (select * from testuser_02 limit 0,2) limit 0,2
速度明顯快了很多,因為采用了子分頁再總分頁的方式,只是多計算了一次分頁而已。
什么時候跨表查詢?
可以采用備份表的方式,將表備份后,記錄備份表的信息,存儲的時間點,數量等。
查詢一般按照時間來跨表,這樣進行查詢的時候根據時間判斷是否需要進行多個表的關聯查詢即可。
最后需要注意表的分頁算法: