Buffers 表引擎將緩沖數(shù)據(jù)寫入內(nèi)存,周期性刷新數(shù)據(jù)到目標(biāo)表. 當(dāng)進(jìn)行讀操作時(shí)测柠,數(shù)據(jù)從緩沖區(qū)讀出,同時(shí)寫入到另一張表少办。
Buffer(database, table, num_layers, min_time, max_time, min_rows, max_rows, min_bytes, max_bytes)
Engine 參數(shù):database, table – 此表是刷新數(shù)據(jù)的目標(biāo)表店煞。與數(shù)據(jù)庫名不同, 你能夠使用常量表達(dá)式蟹演,返回一個(gè)string.num_layers – 并行處理層. 從物理上講,此表將被表示為 'num_layers' 獨(dú)立緩沖層數(shù)顷蟀。推薦值為: 16.min_time, max_time, min_rows, max_rows, min_bytes, 和max_bytes 是從緩沖區(qū)刷新數(shù)據(jù)的條件.
在Buffer中緩沖的數(shù)據(jù)寫入到目標(biāo)表酒请,如果所有的 'min'條件或最少的一個(gè) 'max' 條件是 met.min_time, max_time – 是從第一次寫入到 buffer.min_rows時(shí)開始計(jì)時(shí)的秒數(shù)max_rows – 在 buffer.min_bytes中的行數(shù), max_bytes – 在緩沖區(qū)中字節(jié)的最大數(shù)量.
在寫操作的過程中,數(shù)據(jù)被插入到一個(gè) 隨機(jī)緩沖區(qū)的 'num_layers' 數(shù)量. 或者鸣个,如果插入的數(shù)據(jù)部分足夠大 (> 'max_rows' 或者 'max_bytes'),? 它將直接寫入到目標(biāo)表, 忽略緩沖區(qū).
刷新數(shù)據(jù)單獨(dú)被計(jì)算為每個(gè) 'num_layers' 緩沖區(qū). 例如, 如果num_layers = 16 和 max_bytes = 100000000, 最大 RAM 消耗是 1.6 GB.
CREATE TABLE merge.hits_buffer AS merge.hits ENGINE = Buffer(merge, hits, 16, 10, 100, 10000, 1000000, 10000000, 100000000)
創(chuàng)建一個(gè) 'merge.hits_buffer' 表與'merge.hits'具有相同的表結(jié)構(gòu)羞反,同時(shí)使用 Buffer 引擎. 當(dāng)寫入到此表后, 數(shù)據(jù)將被緩沖到 RAM 中,然后寫入到 'merge.hits' 表中. 16 緩沖區(qū)將被創(chuàng)建囤萤。 每個(gè)緩沖區(qū)中的數(shù)據(jù)將被刷新昼窗,每過100秒,或每寫入100萬條數(shù)據(jù), 或者每寫入100 MB 數(shù)據(jù); 或者如果同時(shí)寫入10 秒涛舍, 10,000條和 10 MB 數(shù)據(jù)澄惊。 例如,如果一行已經(jīng)被寫入 富雅,在100秒后掸驱,它將被刷新。 但是如果多行已經(jīng)被寫入没佑,數(shù)據(jù)將稍微延遲刷新毕贼。
當(dāng)服務(wù)器停止后,DROP TABLE 或 DETACH TABLE, 緩存數(shù)據(jù)也刷新到目標(biāo)表蛤奢。
你能夠在單引號(hào)標(biāo)記上設(shè)置空字符串對于數(shù)據(jù)庫和表名稱鬼癣。 它提示了缺乏一個(gè)目標(biāo)表。在這種情況下, 當(dāng)數(shù)據(jù)刷新條件達(dá)到后远剩,緩沖區(qū)將被清空扣溺。在內(nèi)存中維護(hù)一個(gè)數(shù)據(jù)窗口是必要的。
當(dāng)從一個(gè)緩沖表中讀取數(shù)據(jù)時(shí)瓜晤,數(shù)據(jù)同時(shí)在緩沖表和目標(biāo)表中處理锥余。注意:緩沖表不支持一個(gè)索引。換句話說痢掠,在緩沖區(qū)的數(shù)據(jù)被全表掃描驱犹,對于大的緩沖區(qū)速度將是慢的。(在次級(jí)表中足画,支持的索引將被引用 )
如果在緩沖表中的列集合不能匹配次級(jí)表的列集合, 在2張表中同時(shí)存在的列子集將被插入雄驹。
如果此類型不匹配緩沖表中的列和次級(jí)表的列,則一個(gè)錯(cuò)誤信息將被寫入到服務(wù)器日志中淹辞,緩沖將被清空医舆。當(dāng)緩沖表刷新時(shí),次級(jí)表不存在,則同樣的錯(cuò)誤信息也被寫入到服務(wù)器日志中蔬将。
如果你需要在緩沖表和次級(jí)表中執(zhí)行ALTER語句爷速,我們推薦先刪除緩沖表,然后在次級(jí)表上執(zhí)行ALTER語句霞怀,再創(chuàng)建緩沖表惫东。
如果服務(wù)器出現(xiàn)異常重啟,在緩沖中的數(shù)據(jù)將丟失毙石。
對于緩沖表來說廉沮,PREWHERE, FINAL 和 SAMPLE 不能正常運(yùn)行。這些條件將被傳給目標(biāo)表徐矩,而在緩沖表中不用于處理數(shù)據(jù)滞时。因此, 我們推薦僅使用緩沖表來寫入數(shù)據(jù), 次級(jí)表來讀取數(shù)據(jù)丧蘸,從而實(shí)現(xiàn)讀寫分離漂洋。
當(dāng)數(shù)據(jù)加載到一個(gè)緩沖中后遥皂,一個(gè)緩存將被鎖定力喷。如果在此表上同時(shí)執(zhí)行讀數(shù)據(jù)操作,則將有一定的延時(shí)演训。
插入到一個(gè)緩沖表的數(shù)據(jù)可能以其他的順序和其他的數(shù)據(jù)塊落地到次級(jí)表弟孟。因此,一個(gè)緩存表難以正確地寫入一個(gè) CollapsingMergeTree 表. 為了避免此類問題, 你可以設(shè)置 'num_layers' 到 1样悟。
如果目標(biāo)表是同步的, 一些復(fù)制表的特性將丟失拂募,當(dāng)寫入到緩沖表時(shí)。隨機(jī)改變行的順序和數(shù)據(jù)的大小導(dǎo)致數(shù)據(jù)重復(fù)數(shù)據(jù)刪除窟她,退出工作陈症,意思是不可能有一個(gè)可靠的'exactly once' 寫入到復(fù)制表。
由于上述的劣勢, 我們僅推薦使用一個(gè)緩沖表在特定的場景震糖。
當(dāng)從大量服務(wù)器接收過來太多插入操作時(shí)录肯,適用于使用緩沖表。 在插入之前吊说,數(shù)據(jù)不能被緩沖, 這就意味著 INSERTs 不能運(yùn)行地足夠快论咏。
注意:每次往緩沖表中不要頻繁插入小批量數(shù)據(jù),每秒插入上萬條數(shù)據(jù)最佳 颁井,當(dāng)插入更大數(shù)據(jù)塊時(shí)厅贪,每秒將產(chǎn)生上百萬條數(shù)據(jù)。
版權(quán)聲明:本文版權(quán)歸@神州云聯(lián)科技有限公司所有雅宾,未經(jīng)允許任何單位或個(gè)人不得轉(zhuǎn)載养涮,復(fù)制或以任何其他方式使用本文全部或部分,侵權(quán)必究。