MySQL时间序列分表分区_干货丨时序数据库分区教程
1.為什么對數(shù)據(jù)進(jìn)行分區(qū)?
對數(shù)據(jù)庫進(jìn)行分區(qū)可以極大的降低系統(tǒng)響應(yīng)延遲同時提高數(shù)據(jù)吞吐量。具體來說,分區(qū)有以下幾個好處:
分區(qū)使得大型表更易于管理。對數(shù)據(jù)子集的維護(hù)操作也更加高效,因為這些操作只針對需要的數(shù)據(jù)而不是整個表。一個好的分區(qū)策略將通過只讀取滿足查詢所需的相關(guān)數(shù)據(jù)來減少要掃描的數(shù)據(jù)量。當(dāng)所有的數(shù)據(jù)都在同一個分區(qū)上,對數(shù)據(jù)庫的查詢,計算,以及其它操作都會被限制在磁盤訪問IO這個瓶頸上。
分區(qū)使得系統(tǒng)可以充分利用所有資源。一個良好的分區(qū)方案搭配并行計算,分布式計算就可以充分利用所有節(jié)點來完成通常要在一個節(jié)點上完成的任務(wù)。 當(dāng)一個任務(wù)可以拆分成幾個分散的子任務(wù),每個子任務(wù)訪問不同的分區(qū),就可以達(dá)到提升效率的目的。
分區(qū)增加了系統(tǒng)的可用性。由于分區(qū)的副本通常是存放在不同的物理節(jié)點的。所以一旦某個分區(qū)不可用,系統(tǒng)依然可以調(diào)用其它副本分區(qū)來保證作業(yè)的正常運轉(zhuǎn)。
2.分區(qū)方式
DolphinDB?database支持多種分區(qū)方式: 范圍分區(qū)(RANGE),哈希分區(qū)(HASH),值分區(qū)(VALUE),列表分區(qū)(LIST),復(fù)合分區(qū)(COMPO)。
范圍分區(qū)每個區(qū)間創(chuàng)建一個分區(qū),是最常用的也是推薦的一種分區(qū)方式。可以把數(shù)值在一個區(qū)間內(nèi)的所有記錄放置到一個分區(qū)。
哈希分區(qū)利用哈希函數(shù)對分區(qū)列操作,方便建立指定數(shù)量的分區(qū)。
值分區(qū)每個值創(chuàng)建一個分區(qū),例如股票交易日期,股票交易月。
列表分區(qū)是根據(jù)用戶枚舉的列表來進(jìn)行分區(qū),比值分區(qū)更加靈活。
復(fù)合分區(qū)適用于數(shù)據(jù)量特別大而且查詢經(jīng)常涉及兩個或以上的分區(qū)列。每個分區(qū)選擇都可以采用區(qū)間,值或列表分區(qū)。例如按股票交易日期進(jìn)行值分區(qū), 同時按股票代碼進(jìn)行范圍分區(qū)。
我們可以使用
database函數(shù)創(chuàng)建數(shù)據(jù)庫。
語法:
database(directory, [partitionType], [partitionScheme], [locations])
參數(shù)
directory:數(shù)據(jù)庫保存的目錄。DolphinDB有三種類型的數(shù)據(jù)庫,分別是內(nèi)存數(shù)據(jù)庫、磁盤上的數(shù)據(jù)庫和分布式文件系統(tǒng)上的數(shù)據(jù)庫。創(chuàng)建內(nèi)存數(shù)據(jù)庫,directory為空;創(chuàng)建本地數(shù)據(jù)庫,directory應(yīng)該是本地文件系統(tǒng)目錄;創(chuàng)建分布式文件系統(tǒng)上的數(shù)據(jù)庫,directory應(yīng)該以“dfs://”開頭。本教程以創(chuàng)建Windows本地數(shù)據(jù)庫為例。
partitionType:分區(qū)方式,有5種方式: 范圍分區(qū)(RANGE),哈希分區(qū)(HASH),值分區(qū)(VALUE),列表分區(qū)(LIST),復(fù)合分區(qū)(COMPO)。
partitionScheme:分區(qū)方案。各種分區(qū)方式對應(yīng)的分區(qū)方案如下:
locations:指定每個分區(qū)所在的節(jié)點位置。如果是分布式文件系統(tǒng)的數(shù)據(jù)庫或者復(fù)合分區(qū)(COMPO)類型的數(shù)據(jù)庫,不能使用locations參數(shù)。
2.1 范圍分區(qū)
范圍分區(qū)是由分區(qū)向量決定。分區(qū)向量表示區(qū)間,包含起始值,不包含結(jié)尾值。
在下面的例子中,數(shù)據(jù)庫db有兩個分區(qū):[0,5)和[5,10)。使用函數(shù)append!在數(shù)據(jù)庫db中保存表t為分區(qū)表pt,并使用ID作為分區(qū)列。
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 哈希分區(qū)
哈希分區(qū)對分區(qū)列使用哈希函數(shù)以產(chǎn)生分區(qū)。哈希分區(qū)是產(chǎn)生指定數(shù)量的分區(qū)的一個簡便方法。但是要注意,哈希分區(qū)不能保證分區(qū)的大小一致,尤其當(dāng)分區(qū)列的值的分布存在偏態(tài)的時候。此外,若要查找分區(qū)列上一個連續(xù)區(qū)域的數(shù)據(jù)時,哈希分區(qū)的效率比區(qū)域分區(qū)或值分區(qū)要低。
在下面的例子中,數(shù)據(jù)庫db有兩個分區(qū)。使用函數(shù)append!在數(shù)據(jù)庫db中保存表t為分區(qū)表pt,并使用ID作為分區(qū)列。
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 值分區(qū)
值分區(qū)用一個值代表一個分區(qū)。下面的例子定義了204個分區(qū)。每個分區(qū)表示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 列表分區(qū)
在列表(LIST)分區(qū)中,我們用一個包含多個元素的列表代表一個分區(qū)。下面的例子有兩個分區(qū),第一個分區(qū)包含3個股票代碼,第二個分區(qū)包含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 組合分區(qū)
組合(COMPO)分區(qū)可以定義2或3個分區(qū)列。每列可以獨立采用范圍(RANGE),值(VALUE)或列表(LIST)分區(qū)。組合分區(qū)的多個列在邏輯上是并列的,不存在從屬關(guān)系或優(yōu)先級關(guān)系。
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
上面的例子創(chuàng)建了5個值分區(qū)。
在20170807這個分區(qū),有2個范圍分區(qū)。
總結(jié)
以上是生活随笔為你收集整理的MySQL时间序列分表分区_干货丨时序数据库分区教程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信小程序---授权保存图片或视频,拒绝
- 下一篇: 微信JSAPI几个函数介绍