MySQL 分片策略

分库分表的核心策略

🎯 面试重点

📖 分片策略

常见策略

/**
 * 分片策略
 */
public class ShardingStrategy {
    // 1. 范围分片(Range)
    /*
     * 按时间或 ID 范围分片
     * 
     * 优点:范围查询友好
     * 缺点:可能导致热点
     * 
     * 示例:
     * orders_2024_01, orders_2024_02, ...
     */
    
    // 2. 哈希分片(Hash)
    /*
     * 按主键哈希值取模分片
     * 
     * 优点:数据分布均匀
     * 缺点:范围查询困难
     * 
     * 示例:
     * sharding_key = user_id % 4
     */
    
    // 3. 一致性哈希
    /*
     * 使用一致性哈希环
     * 
     * 优点:增加节点数据迁移少
     * 缺点:实现复杂
     */
    
    // 4. 映射表分片
    /*
     * 使用映射表存储对应关系
     * 
     * 优点:灵活
     * 缺点:增加一次查询
     */
}

分片键选择

/**
 * 分片键选择原则
 */
public class ShardingKey {
    // 选择原则
    /*
     * 1. 业务核心字段
     *    - 最常用于查询的字段
     * 
     * 2. 避免热点
     *    - 不要选择单调递增字段
     * 
     * 3. 分布均匀
     *    - 值域足够分散
     * 
     * 4. 不经常变化
     *    - 不要选择可能变更的字段
     */
    
    // 示例
    /*
     * 订单表:user_id(按用户查询)
     * 交易表:merchant_id(按商家查询)
     * 日志表:created_at(按时间范围查询)
     */
}

跨分片查询

/**
 * 跨分片查询处理
 */
public class CrossSharding {
    // 1. 多次查询 + 合并
    /*
     * 查询所有分片
     * 结果在应用层合并
     * 
     * 示例:分页查询
     */
    
    // 2. 异构索引表
    /*
     * 按另一个分片键建索引表
     * 
     * 示例:订单表按 user_id 分片
     *       另建 order_no -> user_id 索引表
     */
    
    // 3. 基因法
    /*
     * 在分片键中嵌入查询维度
     * 
     * 例如:user_id + order_type
     */
}

📖 面试真题

Q1: 分库分表的适用场景?

答: 单表数据量超过千万、数据写入/查询性能下降、数据库连接数瓶颈。

Q2: 分片键如何选择?

答: 优先选择业务中最常用的查询字段,保证数据分布均匀,避免热点。


⭐ 重点:分库分表是应对大数据量的重要手段