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