分库分表是在面试里一个非常热门而且偏难的话题,下面了解UUID、自增主键和雪花算法的特点,并且在面试的时候刷出亮点。
前置
所谓的分库分表严格来说是分数据源、分库和分表。例如每个公司订单表的分库分表策略就是用了8个主从集群,每个主从集群4个库,每个库有32张表,合起来有8432张表。
不过根据数据规模和读写压力,也可以共享一个主从集群,然后只分库或者只分表。如果面试面到了分库分表的内容,那么主键生成基本上就是一个绕不开的话题。在没有分库分表的时候,我们可以使用自增主键。
比如在MySQL里的建表语句,指定了AUTO_INCREMENT
CREATE TABLE order (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
buyer_id BIGINT NOT NULL
)
在分库分表的场景下,这种自增主键就没法使用了,因为存在冲突的可能。举个最简单的例子,假如我们分库分表只分表,而且按照buyer_id % 2
的值来分成两张表,分别是order_1
和order_2
。如果这两张表都依赖于自增生成主键,那么两张表会生成相同的ID
,但是订单这一类的业务,需要一个全局唯一的ID
。
主键生成一般还伴随两个要点:
- 全局唯一的ID依旧能够保持自增,因为自增与否会显著影响插入的性能;
- 只有数据量大的才会考虑分库分表,而数据量大一般意味着并发高,所以还需要考虑怎么支持高并发