Clickhouse中update/delete的使用

從使用場(chǎng)景來(lái)說(shuō)诸典,Clickhouse是個(gè)分析型數(shù)據(jù)庫(kù)。這種場(chǎng)景下今膊,數(shù)據(jù)一般是不變的些阅,因此Clickhouse對(duì)update、delete的支持是比較弱的斑唬,實(shí)際上并不支持標(biāo)準(zhǔn)的update市埋、delete操作。

下面介紹一下Clickhouse中update恕刘、delete的使用缤谎。

更新、刪除語(yǔ)法

Clickhouse通過(guò)alter方式實(shí)現(xiàn)更新褐着、刪除弓千,它把update、delete操作叫做mutation(突變)献起。語(yǔ)法為:

ALTER TABLE [db.]table DELETE WHERE filter_expr
ALTER TABLE [db.]table UPDATE column1 = expr1 [, ...] WHERE filter_expr

那么洋访,mutation與標(biāo)準(zhǔn)的update镣陕、delete有什么區(qū)別呢?

標(biāo)準(zhǔn)SQL的更新姻政、刪除操作是同步的呆抑,即客戶(hù)端要等服務(wù)端反回執(zhí)行結(jié)果(通常是int值);而Clickhouse的update汁展、delete是通過(guò)異步方式實(shí)現(xiàn)的鹊碍,當(dāng)執(zhí)行update語(yǔ)句時(shí),服務(wù)端立即反回食绿,但是實(shí)際上此時(shí)數(shù)據(jù)還沒(méi)變侈咕,而是排隊(duì)等著。

查看mutation隊(duì)列

那么器紧,怎么查看數(shù)據(jù)是否更新完成了呢耀销?

可以通過(guò)system.mutations表查看相關(guān)信息:

SELECT
    database,
    table,
    command,
    create_time,
    is_done
FROM system.mutations
LIMIT 10

┌─database─┬─table─────────────────┬─command─────────────────────────────────────────────────────────────────────────────┬─────────create_time─┬─is_done─┐
│ app      │ scene_model           │ UPDATE status = '2' WHERE id = '208209306'                                          │ 2020-03-30 15:38:58 │       1 │
│ app      │ scene_model           │ UPDATE status = '2' WHERE id = '100000004'                                          │ 2020-03-30 15:40:00 │       1 │
│ app      │ scene_model           │ UPDATE status = '2' WHERE id = '100000004'                                          │ 2020-03-30 15:41:09 │       1 │
│ app      │ user_model            │ UPDATE name = 'zhuweiming' WHERE id = '0000000047fd31e40147fd3477cc0000'            │ 2020-03-19 18:34:59 │       1 │
│ app      │ work_statistics_total │ UPDATE pv = 10000, uv = 10000 WHERE (id = '1000900') AND (product = 'tracker_view') │ 2020-03-31 14:45:59 │       1 │
│ app      │ work_statistics_total │ UPDATE pv = 10000, uv = 10000 WHERE (id = '1000901') AND (product = 'tracker_view') │ 2020-03-31 14:45:59 │       1 │
│ app      │ work_statistics_total │ UPDATE pv = 10000, uv = 10000 WHERE (id = '1000902') AND (product = 'tracker_view') │ 2020-03-31 14:45:59 │       1 │
│ app      │ work_statistics_total │ UPDATE pv = 10000, uv = 10000 WHERE (id = '1000903') AND (product = 'tracker_view') │ 2020-03-31 14:45:59 │       1 │
│ app      │ work_statistics_total │ UPDATE pv = 10000, uv = 10000 WHERE (id = '1000904') AND (product = 'tracker_view') │ 2020-03-31 14:45:59 │       1 │
│ app      │ work_statistics_total │ UPDATE pv = 10000, uv = 10000 WHERE (id = '1000905') AND (product = 'tracker_view') │ 2020-03-31 14:45:59 │       1 │
└──────────┴───────────────────────┴─────────────────────────────────────────────────────────────────────────────────────┴─────────────────────┴─────────┘
  • database: 庫(kù)名
  • table: 表名
  • command: 更新/刪除語(yǔ)句
  • create_time: mutation任務(wù)創(chuàng)建時(shí)間,系統(tǒng)按這個(gè)時(shí)間順序處理數(shù)據(jù)變更
  • is_done: 是否完成铲汪,1為完成熊尉,0為未完成

除了上述的,還有一些其他的字段掌腰,詳見(jiàn):官方文檔狰住。

通過(guò)以上信息,可以查看當(dāng)前有哪些mutation已經(jīng)完成齿梁,is_done為1即表示已經(jīng)完成催植。

Mutation具體過(guò)程

首先,使用where條件找到需要修改的分區(qū)勺择;
然后查邢,重建每個(gè)分區(qū),用新的分區(qū)替換舊的酵幕,分區(qū)一旦被替換,就不可回退缓苛;

對(duì)于每個(gè)分區(qū)芳撒,可以認(rèn)為是原子性的;但對(duì)于整個(gè)mutation未桥,如果涉及多個(gè)分區(qū)笔刹,則不是原子性的。

注意事項(xiàng)

  • 更新功能不支持更新有關(guān)主鍵或分區(qū)鍵的列
  • 更新操作沒(méi)有原子性冬耿,即在更新過(guò)程中select結(jié)果很可能是一部分變了舌菜,一部分沒(méi)變,從上邊的具體過(guò)程就可以知道
  • 更新是按提交的順序執(zhí)行的
  • 更新一旦提交亦镶,不能撤銷(xiāo)日月,即使重啟clickhouse服務(wù)袱瓮,也會(huì)繼續(xù)按照system.mutations的順序繼續(xù)執(zhí)行
  • 已完成更新的條目不會(huì)立即刪除,保留條目的數(shù)量由finished_mutations_to_keep存儲(chǔ)引擎參數(shù)確定爱咬。 超過(guò)數(shù)據(jù)量時(shí)舊的條目會(huì)被刪除
  • 更新可能會(huì)卡住尺借,比如update intvalue='abc'這種類(lèi)型錯(cuò)誤的更新語(yǔ)句執(zhí)行不過(guò)去,那么會(huì)一直卡在這里精拟,此時(shí)燎斩,可以使用KILL MUTATION來(lái)取消,語(yǔ)法:
kill kutation where database='app' and table='test' // database蜂绎、table是system.mutations表中的字段

使用建議

按照官方的說(shuō)明栅表,update/delete 的使用場(chǎng)景是一次更新大量數(shù)據(jù),也就是where條件篩選的結(jié)果應(yīng)該是一大片數(shù)據(jù)师枣。

舉例:alter table test update status=1 where status=0 and day='2020-04-01'怪瓶,一次更新一天的數(shù)據(jù)。

那么坛吁,能否一次只更新一條數(shù)據(jù)呢劳殖?例如:alter table test update pv=110 where id=100

當(dāng)然也可以,但頻繁的這種操作拨脉,可能會(huì)對(duì)服務(wù)造成壓力哆姻。這很容易理解,如上文提到玫膀,更新的單位是分區(qū)矛缨,如果只更新一條數(shù)據(jù),那么需要重建一個(gè)分區(qū)帖旨;如果更新100條數(shù)據(jù)箕昭,而這100條可能落在3個(gè)分區(qū)上,則需重建3個(gè)分區(qū)解阅;相對(duì)來(lái)說(shuō)一次更新一批數(shù)據(jù)的整體效率遠(yuǎn)高于一次更新一行落竹。

對(duì)于頻繁單條更新的這種場(chǎng)景,建議使用ReplacingMergeTree引擎來(lái)變相解決货抄。具體如何使用述召,以后有時(shí)間再整理。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末蟹地,一起剝皮案震驚了整個(gè)濱河市积暖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌怪与,老刑警劉巖夺刑,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡遍愿,警方通過(guò)查閱死者的電腦和手機(jī)存淫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)错览,“玉大人纫雁,你說(shuō)我怎么就攤上這事∏悴福” “怎么了轧邪?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)羞海。 經(jīng)常有香客問(wèn)我忌愚,道長(zhǎng),這世上最難降的妖魔是什么却邓? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任硕糊,我火速辦了婚禮,結(jié)果婚禮上腊徙,老公的妹妹穿的比我還像新娘简十。我一直安慰自己,他們只是感情好撬腾,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布螟蝙。 她就那樣靜靜地躺著,像睡著了一般民傻。 火紅的嫁衣襯著肌膚如雪胰默。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,736評(píng)論 1 312
  • 那天漓踢,我揣著相機(jī)與錄音牵署,去河邊找鬼。 笑死喧半,一個(gè)胖子當(dāng)著我的面吹牛奴迅,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播挺据,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼取具,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了吴菠?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤浩村,失蹤者是張志新(化名)和其女友劉穎做葵,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體心墅,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡酿矢,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年榨乎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瘫筐。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蜜暑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出策肝,到底是詐尸還是另有隱情肛捍,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布之众,位于F島的核電站拙毫,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏棺禾。R本人自食惡果不足惜缀蹄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望膘婶。 院中可真熱鬧缺前,春花似錦、人聲如沸悬襟。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)古胆。三九已至肆良,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間逸绎,已是汗流浹背惹恃。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留棺牧,地道東北人巫糙。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像颊乘,于是被迫代替她去往敵國(guó)和親参淹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 引言 ClickHouse是近年來(lái)備受關(guān)注的開(kāi)源列式數(shù)據(jù)庫(kù)乏悄,主要用于數(shù)據(jù)分析(OLAP)領(lǐng)域浙值。目前國(guó)內(nèi)社區(qū)火熱,各...
    達(dá)微閱讀 1,935評(píng)論 0 7
  • ClickHouse是近年來(lái)備受關(guān)注的開(kāi)源列式數(shù)據(jù)庫(kù)筐付,主要用于數(shù)據(jù)分析(OLAP)領(lǐng)域卵惦。目前國(guó)內(nèi)社區(qū)火熱,各個(gè)大廠(chǎng)...
    達(dá)微閱讀 824評(píng)論 0 0
  • 一夜說(shuō)長(zhǎng)也長(zhǎng)瓦戚,說(shuō)短也短沮尿。短短的一夜,所有的人跟外公陰陽(yáng)兩隔较解。昨天走的時(shí)候我還跟外婆說(shuō)畜疾,過(guò)幾天我還來(lái),誰(shuí)知道哨坪,就這一...
    marine_bai閱讀 131評(píng)論 2 1
  • 歧道杯空遠(yuǎn)客蹤庸疾,回身佇馬入風(fēng)松。 遙途不辨來(lái)時(shí)路当编,被酒難揮別日容届慈。 有義夷齊輕國(guó)事,無(wú)私管鮑重心胸忿偷。 弟兄唯覺(jué)情深...
    無(wú)人識(shí)閱讀 3,557評(píng)論 60 56
  • 燈初上 映著黃昏的昏黃 天邊 夕陽(yáng)仍有 一些余輝 在做 一日里最后的 觀望
    雪絡(luò)兒閱讀 257評(píng)論 1 0