
华为数据库GaussDB为什么用Ustore?
————
在学习Ustore之前,我们来思考一个问题 :为什么广大知名数据库Oracle、MySQL都在用的引擎InnoDB、MyISAM等,华为不用,而要使用Ustore?Ustore有什么过人之处?为了解答这个问题,我们先从Ustore的应用场景聊起。Ustore常常作为GaussDB的默认行存引擎,而GuassDB常常作为多个高并发交易型应用的数据库,比如说金融行业支付、转账的应用等等,系统常常需要处理大量短小、快速地在线事务处理。
那你肯定又会想,为什么非得用GassDB呢?MySQL不行吗?Oracle不行吗?都行,但是没有拥有ustore引擎的GuassDB合适。因为MySQL和Oracle的引擎是Astore,Astore在遇到大量更新的场景下。会产生大量的‘垃圾’,要实现的操作越多,数据库会变得更慢。
所以,还真的不太合适。
那Ustore怎么改数据?
————
那MySQL、Oracle都不适合,GaussDB却可以,那是为什么呢?首先我们来分析Mysql和Oracle的存储引擎核心思想~
目前市面上有两种主流的存储引擎,我们可以区分为Astore和Ustore,其中Oracle等主流数据库用的就是Astore,而国产数据库GuassDB等用的则是Ustore。
那我们来了解一下他们的区别 ,先来看看Astore~全称是Append Update。首先可以看图中有两个执行更新语句,不同的操作色块代表不同的操作,如执行一是橙色,下图中橙色则为对应的变化,绿色则为公共步骤,执行二以此类推。

从图中可以看出,Astore在得到执行一时,会先找到id=123索引所在的数据页01,Astore将更新的数据写入数据页02,对应的数据行在更新进数据页2的时候,会将整个数据行的索引全部更新,原先索引指向数据页01,现在整个数据行的索引全部指向数据页02,数据页01对应的数据行变成【死元组】,这个数据页不止这一个数据行,所以就有新旧版本的矛盾、交错不清了。当我们又要再次更新,得到执行二时,Astore选择在当前数据页新的位置更新,也是将全部索引更新,然后旧的变为【死元组】。你可能会疑惑,为什么第一个执行一跨页存储,第二个执行二本页存储,这个是不一定的,只是Astore总是在当前表的新位置(可能是新页)写入一条全新的数据。
你可能又有疑惑,那【死元组】们怎么办?这里Astore会有VACUUM扫描所有的数据页去标记元组,VACUUM Full需要重写整个表和索引去回收空间。记住,是所有!看吧,又来消耗性能。这里简单说说VACUUM,它就是【空间】的清洁工,其它的先不了解。
了解完Astore,我们来说说Ustore,也就是今天主要在讲的。

Ustore完全没有【死元组】的概念。它在得到执行一的时候,也是先通过索引找数据页里的数据行,当数据行找到了要准备更新时,会先直接原地更新,如果所要更新的字段值比原纪录大,元数据行无法存放,空间不足时才会考虑在本页或者其他页寻找空闲位置写入。当在本页找到了合适的位置,只更新有改变的指针,这里的指针是指原先你的值可能是hah,指针指向hah的地址,后面你改为new value,指针就指向new value。
当然,在此之前会将旧数据复制到独立的UNDO空间,数据页中的原位置会被复用或变为空闲。
所以Ustore如果要清出【没用】的空间,直接在redo里面清,对主数据区和索引影响小,对于频繁更新,效率 是非常高的。
而且对于新旧版本区分也是较为明显的。所以对于频繁更新的内容,在数据库中使用Ustore终究是很多行业的趋势。
关注我,持续输出高质量内容。
谢谢你看到最后,祝你生活愉快。
如果觉得我写得好,欢迎关注我更多技术文章,在公众号:会用数据库
谢谢!
——生活最好的那条路,是自己主动选择的。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。