Buffers 表引擎將緩沖數(shù)據(jù)寫(xiě)入內(nèi)存,周期性刷新數(shù)據(jù)到目標(biāo)表. 當(dāng)進(jìn)行讀操作時(shí),數(shù)據(jù)從緩沖區(qū)讀出,同時(shí)寫(xiě)入到另一張表。
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ù)庫(kù)名不同, 你能夠使用常量表達(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ù)寫(xiě)入到目標(biāo)表,如果所有的 'min'條件或最少的一個(gè) 'max' 條件是 met.min_time, max_time – 是從第一次寫(xiě)入到 buffer.min_rows時(shí)開(kāi)始計(jì)時(shí)的秒數(shù)max_rows – 在 buffer.min_bytes中的行數(shù), max_bytes – 在緩沖區(qū)中字節(jié)的最大數(shù)量.
在寫(xiě)操作的過(guò)程中,數(shù)據(jù)被插入到一個(gè) 隨機(jī)緩沖區(qū)的 'num_layers' 數(shù)量. 或者,如果插入的數(shù)據(jù)部分足夠大 (> 'max_rows' 或者 'max_bytes'),? 它將直接寫(xiě)入到目標(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)寫(xiě)入到此表后, 數(shù)據(jù)將被緩沖到 RAM 中,然后寫(xiě)入到 'merge.hits' 表中. 16 緩沖區(qū)將被創(chuàng)建。 每個(gè)緩沖區(qū)中的數(shù)據(jù)將被刷新,每過(guò)100秒,或每寫(xiě)入100萬(wàn)條數(shù)據(jù), 或者每寫(xiě)入100 MB 數(shù)據(jù); 或者如果同時(shí)寫(xiě)入10 秒, 10,000條和 10 MB 數(shù)據(jù)。 例如,如果一行已經(jīng)被寫(xiě)入 ,在100秒后,它將被刷新。 但是如果多行已經(jīng)被寫(xiě)入,數(shù)據(jù)將稍微延遲刷新。
當(dāng)服務(wù)器停止后,DROP TABLE 或 DETACH TABLE, 緩存數(shù)據(jù)也刷新到目標(biāo)表。
你能夠在單引號(hào)標(biāo)記上設(shè)置空字符串對(duì)于數(shù)據(jù)庫(kù)和表名稱。 它提示了缺乏一個(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è)索引。換句話說(shuō),在緩沖區(qū)的數(shù)據(jù)被全表掃描,對(duì)于大的緩沖區(qū)速度將是慢的。(在次級(jí)表中,支持的索引將被引用 )
如果在緩沖表中的列集合不能匹配次級(jí)表的列集合, 在2張表中同時(shí)存在的列子集將被插入。
如果此類(lèi)型不匹配緩沖表中的列和次級(jí)表的列,則一個(gè)錯(cuò)誤信息將被寫(xiě)入到服務(wù)器日志中,緩沖將被清空。當(dāng)緩沖表刷新時(shí),次級(jí)表不存在,則同樣的錯(cuò)誤信息也被寫(xiě)入到服務(wù)器日志中。
如果你需要在緩沖表和次級(jí)表中執(zhí)行ALTER語(yǔ)句,我們推薦先刪除緩沖表,然后在次級(jí)表上執(zhí)行ALTER語(yǔ)句,再創(chuàng)建緩沖表。
如果服務(wù)器出現(xiàn)異常重啟,在緩沖中的數(shù)據(jù)將丟失。
對(duì)于緩沖表來(lái)說(shuō),PREWHERE, FINAL 和 SAMPLE 不能正常運(yùn)行。這些條件將被傳給目標(biāo)表,而在緩沖表中不用于處理數(shù)據(jù)。因此, 我們推薦僅使用緩沖表來(lái)寫(xiě)入數(shù)據(jù), 次級(jí)表來(lái)讀取數(shù)據(jù),從而實(shí)現(xiàn)讀寫(xiě)分離。
當(dāng)數(shù)據(jù)加載到一個(gè)緩沖中后,一個(gè)緩存將被鎖定。如果在此表上同時(shí)執(zhí)行讀數(shù)據(jù)操作,則將有一定的延時(shí)。
插入到一個(gè)緩沖表的數(shù)據(jù)可能以其他的順序和其他的數(shù)據(jù)塊落地到次級(jí)表。因此,一個(gè)緩存表難以正確地寫(xiě)入一個(gè) CollapsingMergeTree 表. 為了避免此類(lèi)問(wèn)題, 你可以設(shè)置 'num_layers' 到 1。
如果目標(biāo)表是同步的, 一些復(fù)制表的特性將丟失,當(dāng)寫(xiě)入到緩沖表時(shí)。隨機(jī)改變行的順序和數(shù)據(jù)的大小導(dǎo)致數(shù)據(jù)重復(fù)數(shù)據(jù)刪除,退出工作,意思是不可能有一個(gè)可靠的'exactly once' 寫(xiě)入到復(fù)制表。
由于上述的劣勢(shì), 我們僅推薦使用一個(gè)緩沖表在特定的場(chǎng)景。
當(dāng)從大量服務(wù)器接收過(guò)來(lái)太多插入操作時(shí),適用于使用緩沖表。 在插入之前,數(shù)據(jù)不能被緩沖, 這就意味著 INSERTs 不能運(yùn)行地足夠快。
注意:每次往緩沖表中不要頻繁插入小批量數(shù)據(jù),每秒插入上萬(wàn)條數(shù)據(jù)最佳 ,當(dāng)插入更大數(shù)據(jù)塊時(shí),每秒將產(chǎn)生上百萬(wàn)條數(shù)據(jù)。
版權(quán)聲明:本文版權(quán)歸@神州云聯(lián)科技有限公司所有,未經(jīng)允許任何單位或個(gè)人不得轉(zhuǎn)載,復(fù)制或以任何其他方式使用本文全部或部分,侵權(quán)必究。