对数据库进行分区能够极大的下降系统响应延迟同时提升数据吞吐量。具体来讲,分区有如下几个好处:数据库
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个范围分区。
数据库分区教程(二)将会介绍数据库分区原则以及特殊的分区方案