00:00
那我们来看一下肯耗的一些circle狗操作,其实这一章呢就比较简单了,因为咱们相信大家看到这儿应该有一些数据库的基础,对吧,买circle也好,Oracle也好,或者have也好,那你学习这一块就特别快了,没有什么难度,那所以我们这边介绍的只会介绍一些什么呢,跟标准生活不太一样的地方啊,那首先。我们看一下一个ins色的语法,那这个插入呢,一样啊,就ser into values,这个咱们之前也用过很多遍了,N遍了啊,这个就没必要浪费时间去介绍了,那么还有表到表的插入也是可以的,语法一模一样,这个my soq也好,Have也好,都是这个语法,Inside into1张表,然后。Select从一张表查数据查到一张表啊,这个没啥,那我们可能接下来这个是稍微要关注一点是什么呢?更新及删除,因为咱们的更新也好,删除也好,咱们说了它又不是什么。
01:02
不是oitp数据库,它是一个oip数据库,也就是说它是联机查询分析,那么它对于这种事物型的操作是,呃。提供了一种。间接的实现而已,并不能说它直接就类似MYSQL一样就实现了这种增删改查啊,不不是的啊,它是加上跟h base一样,是不是加了一个标记啊,对吧,呃,那。这一类被称作什么可变查询?变化的突变查询mutation,那么其实它的语法并没有update语法,也没有delete语法,但它能实现这种功能,怎么实现呢?用out table的方式来实现的啊呃,它呢?而且咱们click house要注意一点,它并不支持事务,而且这种突变查询是操作,是一种很重的操作。那所以如果你是每次说哎,某一个小数据要改一下。
02:04
啊,一会儿改一下,一会儿改一下,不建议最好是什么呢?做批量的更改啊批量的更改呃。那我们可以看看。比如说一个删除操作,这个是不是咱们的之前建的那个sum medurate那张表,对吧,那我我们先查一下这张表呗,Select,新from,呃,T order SMT。对吧,好数据是这样的,那我们你看这做的什么out table。其实是有修改表对吧,然后呢,删除,删除什么呢?过滤条件SQID为1001的啊来我们来看一下,看它能不能效果上能不能实现啊,也就是说把哪条删掉呢,ID为。1001啊,就这一条呗,啊,把这一条干掉来试一下,那我们再查一下,你看1001的是没有了,对吧,看起来是删掉了,看起来是删掉了。
03:07
那我们。再来一个。再来一个什么呢?修改操作,那我们这边改了一个什么呢?它也是一个out table,然后表明update。呃,某个字段的值,我把它改成这个。对吧,再加一个过滤条件可以没毛病,那你想想在MYSQL里面的更新。也就修改是什么语句啊,是不是直接用一个update语法对吧?UPDATE2张表,然后呃,Set多少等于多少对吧?那么删除也一样,My circle里面是不是delete from对吧?那语法都不一样,它都是通过out的方式来实现的啊,间接性的实现啊,呃。来,那我们来改一下呗,那这条是什么?当ID为102的时候,我把它的金额字段都全部改成2000对吧?全部改成2000,我们看一下102的,那剩下全是102了,也就是说我们这三条数据的金额都会被改成2000,来我们试一下呢。
04:16
再查一下是不是全改了,你看起来效果是不是跟OITP,也就是my circle狗L这种关系型的,呃,看起来效果一样,实时得到反馈,但其实啊,原来的数据还在的,呃,我尝试着查一下吧,它其实有一个标记字段啊,好像叫version,还有一个叫叫什么来着赛啊。嗯,我想想吧,他的字段。啊,这个可能要加一个漂。我想想啊。嗯,哦,对,不是在这个地方啊,不是在这点记错了啊,这个是一个20.8新功能里面,他帮我们另外一种实现方案了,呃,那其实那它怎么实现呢?咱们从文档介绍里面也能看到啊,他为什么操作比较重呢?因为它分两步执行,第一步。
05:15
新增数据,新增分区,并且把旧分区打上逻辑上的时效标记。其实大家想想它怎么实现呢?同样的道理,咱们have,你想想他要做一个更新操作,比如说某一行某一列的更新,它,呃,老版本是不支持,但在0.14,它是不是支持了一个事务功能啊。但是它底层实现原理是什么大家知道吗?它是不是一个insert over right。是覆盖写啊。对不对,其实hi的这种更新操作也是很重的操作,所以咱们一般也不会去做啊,一般不会去做,那怎么办呢?那咋办呢?同学们,其实咱们有其他的替代方案。
06:00
呃,那关于这个我们替替代方案,一会儿再给大家讲一下思路啊,那像这个其实咱们再它的数据存储也能看到啊,比如说咱们看这个,你看我当前的路径是多少。是不是这张SMT这张表啊。对吧,那这张表呢,咱们刚才一个是做了删除,一个是做了什么更新,那你想想它会怎么样呢?来看一下目录,嗯,这个是刚才做的两次操作。对应两个分区对吧,那其实你看呢,是不是多了这两个东西,又多了一个数字出来,就是标记。啊,那这个是不是比较老的数据。这个是比较老的数据,那其实他数据是不是还在,也就是说他是不是完全弄了一个新的分区,然后把原来的数据和你想改的数据整体再弄了一份出来,所以你大家可想而知,如果我一个分区里面数据量特别大,那这个时候我去做一些更新删除,是不是压力特别大呀,所以我们说那到最后它真正进行合并分片的时候,他会把这些比较老的这些给真正删掉,是保留说我们最新的,那么大家可想而知哪个是最新的,是不是这个五的这个对吧?这个四对应的是啥呢?就是咱们删除这个动作,两个分区嘛,都有一个四,那这个五就是咱们后面做的一些更新。
07:28
啊,更新。从这大家其实可以看到压力还是蛮大的呗,对吧,所以我们一般不建议说你对个别字段个别数据的修改。那你要改就批量的改,这样会好一点,那另外其实呢,呃,可以给大家扩展一下,怎么来实现更新呢?就是不希望他通过这种方式,那有没有办法呢?有啊有办法,那有一种思路是什么,我可以简单给大家写一下啊,比如说我CREATE1张表,我叫A吧,随便起呗,然后字段有好几个,比如说就是A某某某类型,B某某某类型,C某某某类型,可以吧,这算是给大家一个扩展啊,嗯,我写在笔记里面吧。
08:20
我写在这啊,嗯,实现高性能update或delete的思路,好,那我建一张表是这样,那我可以干嘛加两个标记,一个叫什么呢?比如说我叫他赛,我随便起个名字好吧,那这个我可以用一个U8。来表示,那我可以再来一个version,呃,我用来。嗯,这个也u in的八呗,啊八可能不太够,我可以给个16啊或者三二呗,三二吧,好,那这个时候思路是怎么样的,更新,我可以插入一条新的数据对吧,然后呢。
09:10
这时候我们干一个什么版本号加一是不是就行了。那我每次未来我查询的时候加上一个过滤条件,什么过滤条件呢,就是VR啊。我想讲啊。VR版本号最大的对吧,你可以取一个。Max对吧,Version等于max version,但是这样是不是也也有一定的压力啊。对吧,这也是有一定压力的,但相对你,嗯,整个来说处理。不一定更好,但只是说我们提供另一个思路啊,通过打版本打标记的。
10:02
这种场景,或者说你直接可以按照什么时间,好像你的C字段是一个create time,那你是不是取时间最大的一条就好了。对吧,你就不要取其他的啊,其实咱们介绍前面这些引擎的时候,他们是不是也会做类似的操作呀,取什么时间戳最大的对不对,还记得吧。其实底层也差不多,那删除呢很简单,我用用一个标记字段,就是这个,我比如说零,呃表示已删除啊表示未删除,一表示已删除。那我这边做一个什么事呢?其实也很简单,我就是每次查询的时候加上一个过滤条件什么呢?Where。呃。
11:01
S等于零是不是也就是说我查的时候查出来的一定是?他。那有的同学说,那我我原来有一条标记是零没删除,后来删了标记为一,那你是不是把老数据查出来了呀。对不对,那既然是这样,你是不是还得加上一个条件,N version最大。对吧,那同时这里的superversion等于加一呀,对吧,那这样就能保证,呃,咱们的历史数据被删掉了,就被过滤掉了呗,但这种是不是咱们自己想方法,但是也有一个问题。时间久了是不是数据膨胀了,对吧,已经删掉了,你是不是删掉就得了呗,你还保留着干嘛,而且你要删它,你是不是还得多插入一条,这种是方案的缺陷,所以你还得考虑类似合并机制,怎么把过期数据。
12:07
清除掉。对吧,这是另外一种实现的思路,对吧?当然了,你你看人家就很直白了,我直接覆盖写一份,那合并的时候我把老的数据给清空掉,对吧,这个只是给大家提供一个思路而已啊。你多思考思考。其实。还是可以的吧,这种思路还是可以的啊。行,这个咱们聊多了啊,聊多了因为什么呢?因为这个确实。不太建议用,但如果你非要做更新和删除怎么办呢?对吧。那可能你包括你现在去,呃,应聘一些相关的实施岗位,涉及到click click house的话,肯定也会问这一块,首先第一个问题,咱们的click house支不支持事务。第二个问题就是更具体的支不支持更新及删除。第三个如果不支持,那你怎么办?
13:03
对吧,首先第一个问题,那肯定是不支持失误操作的呀,第二种支不支持更新删除啊,我们说它其实是间接实现的,通过out table,而且是一个比较重的操作,它会生成一个新的临时分区目录。到了合并的时候才会把那些过期的给清空掉,相当于说又重新写了一份啊整个分区,那有的就会问,那怎么避免,怎么解决这个问题啊,你可以说我们是设计的一些标记字段对吧,然后呢,定期对老数据做一个清除。这只是一些方案对吧,或者你直接就是什么,咱们的使用场景本来就是oip数据库,就不应该做一些更新跟删除操作,对吧。确实不应该,但嗯,实际开发应用中,可能确实有人会这么去用啊,会这么去用。
我来说两句