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: 分片键如何选择?
答: 优先选择业务中最常用的查询字段,保证数据分布均匀,避免热点。
⭐ 重点:分库分表是应对大数据量的重要手段