分库分表之后,id 主键如何处理?

1 个回答

  • 周一仙
    在漆黑的夜里,你需要一道光照亮夜行的路,我燃烧了我自己,但也造就了你我不能相拥。
    ### 分库分表后的主键处理方法 在分库分表的场景下,需要确保每个表中的主键全局唯一。以下是几种常见的生成全局唯一 ID 的方法: #### 1. UUID - **特点**:生成的 UUID 长且无序,不适合作为主键。 - **适用场景**:适合用于生成唯一的标识符,如文件名。 - **缺点**:长度较长,无序且不可读,查询效率低。 - **示例**: ```java import java.util.UUID; String uniqueID = UUID.randomUUID().toString(); ``` #### 2. 数据库自增 ID - **特点**:通过设置不同的步长,在两台数据库中生成不重复的 ID。 - **适用场景**:适用于需要有序 ID 的场景。 - **优点**:生成的 ID 有序。 - **缺点**:需要独立部署数据库实例,成本高,存在性能瓶颈。 - **示例**: ```sql -- 数据库A CREATE TABLE id_generator ( id BIGINT AUTO_INCREMENT PRIMARY KEY, stub CHAR(1) NOT NULL UNIQUE ); INSERT INTO id_generator (stub) VALUES ('a'); SET @@auto_increment_increment=2; SET @@auto_increment_offset=1; -- 数据库B CREATE TABLE id_generator ( id BIGINT AUTO_INCREMENT PRIMARY KEY, stub CHAR(1) NOT NULL UNIQUE ); INSERT INTO id_generator (stub) VALUES ('b'); SET @@auto_increment_increment=2; SET @@auto_increment_offset=2; ``` #### 3. 利用 Redis 生成 ID - **特点**:性能较好,灵活方便,不依赖数据库。 - **适用场景**:适用于需要高性能、灵活的 ID 生成方案。 - **优点**:生成 ID 性能高,灵活方便。 - **缺点**:引入新的组件,系统更加复杂,可用性降低,编码复杂,增加系统成本。 - **示例**: ```java import redis.clients.jedis.Jedis; Jedis jedis = new Jedis("localhost"); long uniqueID = jedis.incr("global:id"); ``` #### 4. Twitter 的 Snowflake 算法 - **特点**:生成全局唯一且趋势递增的 ID。 - **适用场景**:适用于需要分布式 ID 生成的场景。 - **优点**:生成 ID 全局唯一,趋势递增,性能高。 - **缺点**:需要部署独立的服务,依赖 Zookeeper 等中间件。 - **示例**: ```java public class SnowflakeIdGenerator { private final long workerId; private final long datacenterId; private final long sequence; // Define other fields and methods as per the Snowflake algorithm // You can find the complete implementation at the GitHub repository: // https://github.com/twitter-archive/snowflake } ``` - **参考**: - GitHub 地址:https://github.com/twitter-archive/snowflake #### 5. 美团的 Leaf 分布式 ID 生成系统 - **特点**:生成全局唯一、趋势递增、单调递增的 ID。 - **适用场景**:适用于需要高可用、高性能的分布式 ID 生成系统。 - **优点**:ID 全局唯一,趋势递增,信息安全。 - **缺点**:需要依赖关系数据库、Zookeeper 等中间件。 - **示例**: ```java // 引入 Leaf 的依赖和配置 // 使用 Leaf 服务生成 ID long uniqueID = leafService.getId("order_id"); ``` - **参考**: - GitHub 地址:https://github.com/Meituan-Dianping/Leaf - 美团技术团队的文章:https://tech.meituan.com/2017/04/21/mt-leaf.html ### 总结 - **UUID**:适用于生成唯一标识符,不适合作为主键。 - **数据库自增 ID**:适用于有序 ID,需独立部署数据库实例。 - **Redis 生成 ID**:适用于高性能、灵活的 ID 生成,增加系统复杂度。 - **Twitter 的 Snowflake 算法**:适用于分布式 ID 生成,性能高,依赖中间件。 - **美团的 Leaf 系统**:适用于高可用、高性能的分布式 ID 生成系统,依赖中间件。 选择适合的方案可以有效解决分库分表后的主键问题,确保全局唯一性和性能。
    发布于 2024-08-02 05:24 •IP属地 上海
    举报
    评论
    收藏