對數據庫進行分區能夠極大的下降系統響應延遲同時提升數據吞吐量。具體來講,分區有如下幾個好處:數據庫
DolphinDB支持多種分區方式: 範圍分區(RANGE),哈希分區(HASH),值分區(VALUE),列表分區(LIST),複合分區(COMPO)。app
咱們能夠使用database函數建立數據庫。分佈式
語法:database(directory, [partitionType], [partitionScheme], [locations])ide
參數函數
directory:數據庫保存的目錄。DolphinDB有三種類型的數據庫,分別是內存數據庫、磁盤上的數據庫和分佈式文件系統上的數據庫。建立內存數據庫,directory爲空;建立本地數據庫,directory應該是本地文件系統目錄;建立分佈式文件系統上的數據庫,directory應該以「dfs://」開頭。本教程以建立Windows本地數據庫爲例。spa
partitionType:分區方式,有5種方式: 範圍分區(RANGE),哈希分區(HASH),值分區(VALUE),列表分區(LIST),複合分區(COMPO)。blog
partitionScheme:分區方案。各類分區方式對應的分區方案以下:教程
locations:指定每一個分區所在的節點位置。若是是分佈式文件系統的數據庫或者複合分區(COMPO)類型的數據庫,不能使用locations參數。內存
2.1 範圍分區資源
範圍分區是由分區向量決定。分區向量表示區間,包含起始值,不包含結尾值。
在下面的例子中,數據庫db有兩個分區:[0,5)和[5,10)。使用函數append!在數據庫db中保存表t爲分區表pt,並使用ID做爲分區列。
n=1000000 ID=rand(10, n) x=rand(1.0, n) t=table(ID, x) db=database("dfs://rangedb", RANGE, 0 5 10) pt = db.createPartitionedTable(t, `pt, `ID) pt.append!(t); pt=loadTable(db,`pt) select count(x) from pt
2.2 哈希分區
哈希分區對分區列使用哈希函數以產生分區。哈希分區是產生指定數量的分區的一個簡便方法。可是要注意,哈希分區不能保證分區的大小一致,尤爲當分區列的值的分佈存在偏態的時候。此外,若要查找分區列上一個連續區域的數據時,哈希分區的效率比區域分區或值分區要低。
在下面的例子中,數據庫db有兩個分區。使用函數append!在數據庫db中保存表t爲分區表pt,並使用ID做爲分區列。
n=1000000 ID=rand(10, n) x=rand(1.0, n) t=table(ID, x) db=database("dfs://hashdb", HASH, [INT, 2]) pt = db.createPartitionedTable(t, `pt, `ID) pt.append!(t); pt=loadTable(db,`pt) select count(x) from pt
2.3 值分區
值分區用一個值表明一個分區。下面的例子定義了204個分區。每一個分區表示2000年1月到2016年12月之間的一個月。
n=1000000 month=take(2000.01M..2016.12M, n) x=rand(1.0, n) t=table(month, x) db=database("dfs://valuedb", VALUE, 2000.01M..2016.12M) pt = db.createPartitionedTable(t, `pt, `month) pt.append!(t) pt=loadTable(db,`pt) select count(x) from pt
2.4 列表分區
在列表(LIST)分區中,咱們用一個包含多個元素的列表表明一個分區。下面的例子有兩個分區,第一個分區包含3個股票代碼,第二個分區包含2個股票代碼。
n=1000000 ticker = rand(`MSFT`GOOG`FB`ORCL`IBM,n); x=rand(1.0, n) t=table(ticker, x) db=database("dfs://listdb", LIST, [`IBM`ORCL`MSFT, `GOOG`FB]) pt = db.createPartitionedTable(t, `pt, `ticker) pt.append!(t) pt=loadTable(db,`pt) select count(x) from pt
2.5 組合分區
組合(COMPO)分區能夠定義2或3個分區列。每列能夠獨立採用範圍(RANGE),值(VALUE)或列表(LIST)分區。組合分區的多個列在邏輯上是並列的,不存在從屬關係或優先級關係。
n=1000000 ID=rand(100, n) dates=2017.08.07..2017.08.11 date=rand(dates, n) x=rand(10.0, n) t=table(ID, date, x) dbDate = database(, VALUE, 2017.08.07..2017.08.11) dbID=database(, RANGE, 0 50 100) db = database("dfs://compoDB", COMPO, [dbDate, dbID]) pt = db.createPartitionedTable(t, `pt, `date`ID) pt.append!(t) pt=loadTable(db,`pt) select count(x) from pt
上面的例子建立了5個值分區。
在20170807這個分區,有2個範圍分區。
數據庫分區教程(二)將會介紹數據庫分區原則以及特殊的分區方案