设计原理:分区键选择如何兼顾兼容性与性能
首先我们刚才提到,水平扩容第一个问题是数据如何进行拆分。因为数据拆分是第一步,这个会影响到后续整个使用过程。对TDSQL来说,数据拆分的逻辑放到一个创建表的语法里面。需要业务去指定 shardkey“等于某个字段”——业务在设计表结构时需要选择一个字段作为分区键,这样的话TDSQL会根据这个分区键做数据的拆分,而访问的话会根据分区键做数据的聚合。我们是希望业务在设计表结构的时候能够参与进来,指定一个字段作为shardkey。这样一来,兼容性与性能都能做到很好的平衡。
其实我们也可以做到用户创建表的时候不指定shardkey,由我们底层这边随机选择一个键做数据的拆分,但这个会影响后续的使用效率,比如不能特别好地发挥分布式数据库的使用性能。我们认为,业务层如果在设计表结构时能有少量参与的话,可以带来非常大的性能优势,让兼容性和性能得到平衡。除此之外,如果由业务来选择shardkey——分区键,在业务设计表结构的时候,我们可以看到多个表,可以选择相关的那一列作为shardkey,这样可以保证数据拆分时,相关的数据是放在同一个节点上的,这样可以避免很多分布式情况下的跨节点的数据交互。
我们在创建表的时候,分区表是我们最常用的,它把数据拆分到各个节点上。此外,其实我们提供了另外两种——总共会提供三种类型的表,背后的主要思考是为了性能,就是说通过将global表这类数据是全量在各个节点上的表——一开始大家会看到,数据全量在各个节点上,就相当于是没有分布