數據分區是什麼?mysql
數據庫分區是一種物理數據庫設計技術,DBA和數據庫建模人員對其至關熟悉。
sql
分區把一大塊數據分紅了n小塊,這樣查詢的時候很快定位到某一小塊上,在小塊中尋址要快不少;數據庫
多大的數據量才須要分區?數據庫設計
參考標準,若是一張表的記錄超過在超過1000w,並以每個月百萬的數據量增加,那須要分區。
函數
爲何須要數據分區?性能
性能提高;方便管理;避免數據傾斜優化
改善數據庫的結構有兩種,一種是採用存儲過程代替普通的SQL語句,spa
另一種就是使用數據庫系統中加強索引和規劃分區表進行優化,設計
數據分區主要目的是爲了在特定的SQL操做中減小數據讀寫的總量以縮減響應時間。orm
有幾種常見的數據分區?各自的優缺點 (基於mysql)
行分區 ----按日期的分區
列分區--- 參數值個數比較少 國際化按國家的分區
range分區:行數據基於屬於一個給定連續區間的列值被放入分區,mysql5.5開始支持range columns的分區。
list分區:分區面向的是離散的值,mysql5.5支持list columns。
hash分區:根據用戶自定義的表達式的返回值來進行分區,返回值不能爲負數。
key分區:根據MYSQL數據庫提供的哈希函數來進行分區。
謹記:不管使用何種類型的分區,分區老是在建立時就自動的順序編號,且從0開始記錄;
只有RANGE和LIST支持子分區,可是子分區內只能使用HASH和KEY分區。
5.hive分區
由於分區列的值要轉化爲文件夾的存儲路徑,
在表的數據文件中實際上並不保存分區列的信息與數據。
數據是根據文件夾的名字讀取來的,而不是實際從數據文件中讀取來的。
通常向分區表中插入數據時系統會校驗數據是否符合該分區,若是不符合會報錯。
而在hive中,向某個分區中插入什麼樣的數據徹底是由人來控制的。
動態分區能夠根據查詢獲得的數據自動匹配到相應的分區中去。
先設置hive.exec.dynamic.partition參數值爲true,默認值爲false,即不容許使用:
若是源數據對應的province子分區不存在,則會自動建立,很是方便,
並且避免了人工控制插入數據與分區的映射關係存在的潛在風險。
爲了讓分區列的值相同的數據儘可能在同一個mapreduce中,
這樣每個mapreduce能夠儘可能少的產生新的文件夾,
能夠藉助distribute by的功能,將分區列值相同的數據放到一塊兒.
附distributed by
ditribute by是控制map的輸出在reducer是如何劃分的,舉個例子,咱們有一張表,mid是指這個store所屬的商戶,money是這個商戶的盈利,name是這個store的名字
store:
midmoneyname
AA15.0商店1
AA20.0商店2
BB22.0商店3
CC44.0商店4
執行hive語句:
select mid, money, name from store distribute by mid sort by mid asc, money asc
咱們全部的mid相同的數據會被送到同一個reducer去處理,這就是由於指定了distribute by mid,這樣的話就能夠統計出每一個商戶中各個商店盈利的排序了(這個確定是全局有序的,由於相同的商戶會放到同一個reducer去處理)。這裏須要注意的是distribute by必需要寫在sort by以前。