author:skate
time:2013/05/20
分庫分表的排序
1. 對於單庫,冗餘一個匯總所有資料表,用於全部資料的排序,但是當資料量大,匯總表將會成為瓶頸。這不是一個很好的方案
2. 無論單庫還是多個分庫,都由程式讀取需要資料並作排序。
排序的幾種方式:
大都是按時間排序的,如果在用戶端可以直接判斷在哪個分表最好,可以直接讀取指定分表並作排序
例如:
匯總表td_test_all;而分表是按companyid分表的
原始sql:
SELECT * FROM td_test_all
WHERE companyid = 15997
order by productid desc limit 0,20
程式端完全可以通過companyid判斷在哪個分表讀取資料,改為
SELECT * FROM td_test7
WHERE companyid = 15997
order by productid desc limit 0,20
這樣資料的排序還是通過資料實現的。
如果where條件裡沒有分區欄位的話,如何定位到具體分區呢?可以在設計階段,在常用欄位上埋下分區規則的種子, 比如在td_test7.groupid欄位設計由int+7(7表示在分表td_test7裡)
如果資料必須從多個分表取資料的話:
對於取top N條記錄的話情境
程式分表讀取每個分表的前N條記錄(理想的認為資料都來源一個分表,從而減小結果集),如分區td_test0所示:
SELECT *
FROM td_test0
WHERE createtime> STR_TO_DATE('2013-04-28 15:34:02','%Y-%m-%d %H:%i:%s')
ORDER BY createtime DESC
LIMIT 0,5
然後程式讀取這些結果集,在應用端匯總排序取top N記錄
對於需要分頁的話情境
這個就只能把每個分表、滿足條件的的所有記錄都load到應用端,然後在程式端很容易做匯總,排序分頁操作
大家還有什麼好的方法, 請補充.......
------end----