He3DB在实现跨域功能的过程中,实现唯一性约束将会是一个巨大的挑战。这篇文章,我们一起了解CRDB在实现唯一性约束时的做法。
几乎所有的数据库都依赖索引来执行唯一性约束,而不是通过代价高昂的全表扫描来实现。因此,分区数据库通常只能在分区级别实现唯一性约束。
在CRDB中,带有region by row属性的表,索引是按区域隐式分区的,但是CRDB可以实现不带分区列的全局唯一约束。通过将约束检查在insert或update语句之后作为事务的一部分来实现。为了优化执行检查,优化器使用一种高效的连接算法,在每一个包含数据的区域中,对分区的唯一索引中执行一次点查。为了避免跨域产生的延迟,优化器会在安全的情况下省略这些检查。用户可以通过一下几种方式来减少跨域的检查。
(1)为唯一列使用UUID类型,并让系统使用DEFAULT gen_random_uuid()生成值。由于UUID与此函数冲突的概率可以忽略不计,因此默认情况下不执行唯一性检查。
(2)在唯一性约束定义中显示包括crdb_region。
(3)将crdb_region定义为依赖于为一列的计算列。通过这种方式,相关的为一列成为分区模式中的一部分,因此分区内的唯一性意味着全局唯一性。
尽管实现全局唯一性约束会增加一些insert和update的延迟,但是可以保证全局唯一性约束。基于此,CRDB可以支持具有域内延迟的查询,即本地优化查询。当用户知道自己搜索的是唯一行,但具体位置未知时,可以使用这种优化。CRDB可以先在本地搜索,如果找到了,就不用跨域去搜索。此外,只要最大行数已知,本地优化搜索可以推广到任何有限的行数。
参考文献:Enabling the Next Generation of Multi-Region Applications with CockroachDB**




