MySQL时间序列分表分区_干货丨时序数据库分区教程
1.為什么對數據進行分區?
對數據庫進行分區可以極大的降低系統響應延遲同時提高數據吞吐量。具體來說,分區有以下幾個好處:
分區使得大型表更易于管理。對數據子集的維護操作也更加高效,因為這些操作只針對需要的數據而不是整個表。一個好的分區策略將通過只讀取滿足查詢所需的相關數據來減少要掃描的數據量。當所有的數據都在同一個分區上,對數據庫的查詢,計算,以及其它操作都會被限制在磁盤訪問IO這個瓶頸上。
分區使得系統可以充分利用所有資源。一個良好的分區方案搭配并行計算,分布式計算就可以充分利用所有節點來完成通常要在一個節點上完成的任務。 當一個任務可以拆分成幾個分散的子任務,每個子任務訪問不同的分區,就可以達到提升效率的目的。
分區增加了系統的可用性。由于分區的副本通常是存放在不同的物理節點的。所以一旦某個分區不可用,系統依然可以調用其它副本分區來保證作業的正常運轉。
2.分區方式
DolphinDB?database支持多種分區方式: 范圍分區(RANGE),哈希分區(HASH),值分區(VALUE),列表分區(LIST),復合分區(COMPO)。
范圍分區每個區間創建一個分區,是最常用的也是推薦的一種分區方式。可以把數值在一個區間內的所有記錄放置到一個分區。
哈希分區利用哈希函數對分區列操作,方便建立指定數量的分區。
值分區每個值創建一個分區,例如股票交易日期,股票交易月。
列表分區是根據用戶枚舉的列表來進行分區,比值分區更加靈活。
復合分區適用于數據量特別大而且查詢經常涉及兩個或以上的分區列。每個分區選擇都可以采用區間,值或列表分區。例如按股票交易日期進行值分區, 同時按股票代碼進行范圍分區。
我們可以使用
database函數創建數據庫。
語法:
database(directory, [partitionType], [partitionScheme], [locations])
參數
directory:數據庫保存的目錄。DolphinDB有三種類型的數據庫,分別是內存數據庫、磁盤上的數據庫和分布式文件系統上的數據庫。創建內存數據庫,directory為空;創建本地數據庫,directory應該是本地文件系統目錄;創建分布式文件系統上的數據庫,directory應該以“dfs://”開頭。本教程以創建Windows本地數據庫為例。
partitionType:分區方式,有5種方式: 范圍分區(RANGE),哈希分區(HASH),值分區(VALUE),列表分區(LIST),復合分區(COMPO)。
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個范圍分區。
總結
以上是生活随笔為你收集整理的MySQL时间序列分表分区_干货丨时序数据库分区教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微信小程序---授权保存图片或视频,拒绝
- 下一篇: oracle sql 分区查询语句_Or