本文共5500字,建議閱讀10+分鐘。
一個物理表的數據量太大時,就會影響查詢和計算的性能。
這裡的時序數據泛指一切隨時間推移而不斷增長的數據,比如通話記錄、銀行交易記錄等。
對於資料庫來講,時序數據並沒有什麼特殊性,可以和普通數據一樣放在數據表中。不過,因為不斷增長,積累時間較長後,這種數據的量常常都會很大。一個物理表的數據量太大時,就會影響查詢和計算的性能。
現代資料庫一般都提供有表分區(PARTITION)的機制,就是把一個大表縱向(按行)分成若干區段,分區規則由資料庫管理員來設置,對應用程式員來講是透明的,可以和不分區的表一樣訪問,資料庫會自動根據查詢條件決定讀取哪些分區的數據,這樣的接口體驗非常好。
不過,在實戰中,分區表的效果在某些場景下並不好,而且使用時也有些約束條件,並不總好用且能用的。結果,在實際業務中,我們常常會看到對於這種大數據採用手工物理分表的方案。
所謂物理分表,就是人為將一個大表分成若干較小的物理數據表。因為時序數據的結構中一定會有一個欄位來表示事件發生的時刻,而事件發生的數量一般來講也會按時間段相對平均分布(大多數情況會緩慢增長,但討論時可以忽略),所以最常用的方案就是按時間段來做分表,比如一個月數據對應一個分表,這種方式在金融、電信行業比較普遍。
物理分表並不是資料庫自動支持的方案,不能對應用程式做到透明,需要應用程式自己處理。在查詢數據時一般都會有時間段參數,應用程式可以根據這個參數計算出該查詢涉及哪些分表,然後將這些分表UNION起來拼到SQL語句的FROM後面。查詢不涉及的時間段對應的分表不會被拼進來,這樣就可以有效減少數據遍歷的範圍,從而提高性能。
這個方案在單個資料庫時沒啥毛病,但是不是能推廣到多個資料庫的情況呢?
數據量再大下去,一個資料庫也無法承受了,而某些場景下又不允許我們上一套分布式資料庫系統,畢竟分布式資料庫是個沉重的工程,不僅造價高,而且維護管理都要複雜不少。這時候,我們可以擺多個資料庫分別存儲數據,類似物理分表的方案,也按時間段把數據分拆到各個資料庫中,比如一年數據放入一個資料庫中(一般來講多個庫會部署到多臺機器上),這樣就能分攤查詢壓力了。
這首先會有一個查詢範圍的問題,如果查詢的時間跨度超過了一個物理分庫時,這時候就不能象分表時那樣用UNION拼起來了,資料庫無法執行跨庫的SQL語句。不過,這個問題還不算嚴重,只是查詢明細數據時,要把各個分庫的返回數據拼接起來,這並不算困難。甚至,要求前端查詢範圍必須落在一個分庫內也不為過(比如必須先選擇查詢年份),因為一個分庫的數據量並不算少,這樣用戶體驗略有損失,但也可以容忍。
這種方案還會有壓力不平衡的問題。
對於時序數據,近期數據的查詢頻繁度遠遠高於遠期數據,大多數查詢都集中在最近一段時間中,存放近期數據的分庫上任務就很重,並發較多時仍然會有性能瓶頸,而存放遠期數據的分庫卻幾乎沒事幹,並不能有效分攤查詢壓力。
還有別的辦法嗎?
可以採用蛇形分布。比如將多年數據分拆到10個分庫中,可以按日期拆分,所有年份中1月1日的數據放到1號分庫中,1月2日的放到2號分庫,…,1月10號的放到10號分庫,1月11號的再從1號分庫輪迴,…;其它情況的具體分法也可以根據時序數據的時刻欄位的分布情況來決定。
這樣分下來,每個分庫存儲的數據量差不多也就是1/n,相對比較平均,還可以規避前面說的數據緩慢增長導致的不平衡;而且,無論近期數據還是遠期數據的查詢都會被分攤到各個分庫中,看起來能夠充分利用硬體資源了。
還有點注意事項!
蛇形分布時,每個分庫中都有所有年份的數據,幾乎每個查詢都會涉及到所有分庫的數據,不能只挑出某些分庫來執行運算,這和前面說的分表方案的優化原理並不一樣了。我們需要在分庫中繼續做分表,查詢確實會涉及所有分庫,但只涉及分庫中的某些分表,這樣仍然可以有效的減少查詢範圍,同時利用分庫並行的優勢。
第二個問題:每個分庫都可能返回數據,應用程式需要把這些數據再做一次匯總,而不能象單庫分表那樣用UNION推給資料庫去完成。對於常見的明細查詢,那只要簡單拼接再排序就可以了,開發起來並不難;但如果涉及到分組匯總就會麻煩很多,應用程式員並不擅長編寫這種運算,這時候最好藉助集算器這類外部計算引擎來協助實現跨庫匯總運算。
當然,成本和條件允許時直接上分布式資料庫就更簡單,分布式資料庫採用HASH方案基本上可以被理解成是蛇形分布的。
潤乾軟體創始人、首席科學家
清華大學計算機碩士,中國大數據產業生態聯盟專家委員,著有《非線性報表模型原理》等,1989年,中國首個國際奧林匹克數學競賽團體冠軍成員,個人金牌;2000年,創立潤乾公司;2004年,首次在潤乾報表中提出非線性報表模型,完美解決了中國式複雜報表制表難題,目前該模型已經成為報表行業的標準;2014年,經過7年開發,潤乾軟體發布不依賴關係代數模型的計算引擎——集算器,有效地提高了複雜結構化大數據計算的開發和運算效率;2015年,潤乾軟體被福布斯中文網站評為「2015福布斯中國非上市潛力企業100強」;2016、2017年,榮獲中國電子信息產業發展研究院評選的「中國軟體和信息服務業十大領軍人物」;2017年度中國數據大工匠、數據領域專業技術講堂《數據蔣堂》創辦者。
《數據蔣堂》的作者蔣步星,從事信息系統建設和數據處理長達20多年的時間。他豐富的工程經驗與深厚的理論功底相互融合、創新思想與傳統觀念的相互碰撞,虛擬與現實的相互交織,產生出了一篇篇的瀝血之作。此連載的內容涉及從數據呈現、採集到加工計算再到存儲以及挖掘等各個方面。大可觀數據世界之遠景、小可看技術疑難之細節。針對數據領域一些技術難點,站在研發人員的角度從淺入深,進行全方位、360度無死角深度剖析;對於一些業內觀點,站在技術人員角度闡述自己的思考和理解。蔣步星還會對大數據的發展,站在業內專家角度給予預測和推斷。靜下心來認真研讀你會發現,《數據蔣堂》的文章,有的會讓用戶避免重複前人走過的彎路,有的會讓攻城獅面對扎心的難題茅塞頓開,有的會為初入行業的讀者提供一把開啟數據世界的鑰匙,有的甚至會讓業內專家大跌眼鏡,產生思想交鋒。
數據蔣堂 | 存儲和計算技術的選擇
數據蔣堂 | 人工智慧中的「人工」
數據蔣堂 | 中國報表漫談
數據蔣堂 | 內存數據集產生的隱性成本
數據蔣堂 | 多維分析預匯總的功能盲區
數據蔣堂 | 多維分析預匯總的存儲容量
數據蔣堂 | 多維分析預匯總的方案探討
數據蔣堂 | 資料庫的封閉性
數據蔣堂 | 內存數據集產生的隱性成本
數據蔣堂 | 前半有序的大數據排序
數據蔣堂 | 「後半」有序的分組