
分库维度的选择 通过分析SQL查询模式,优先选择WHERE语句中最常出现的过滤字段作为分库维度。在1号店的案例中,用户ID在85%的高频SQL中出现,因此选为用户ID作为分库维度,确保大部分查询能命中单一数据库。
数据分布方式 采用取模分库法(如用户ID mod 6),保证数据均匀分布且便于后续扩容。初次分库建议4~8个库,1号店选择6个库以平衡性能与硬件成本。对于超级ID(如大客户数据),需单独分配库以避免数据倾斜。
分布式数据访问层(DDAL) 基于持久层框架(如iBatis)封装DDAL,实现自动路由:
分页查询优化
跨库字段映射 建立订单ID与用户ID的Lookup表,存储在独立库中。通过查询该表快速定位订单所属分库,避免全库扫描。例如:
-- Lookup表示例
CREATE TABLE order_user_mapping (
order_id BIGINT PRIMARY KEY,
user_id BIGINT NOT NULL
);扩容与数据迁移 采用倍数扩容策略(如6库→12库),仅需迁移50%数据至新库。旧记录按新模数重新分配,减少全量数据迁移的开销。
分库数量评估
超级ID处理 对高频访问的大客户数据(如广告主),独立分配专属库,避免常规分库规则导致的热点问题。
通过上述策略,1号店成功将订单库从Oracle迁移至MySQL集群,实现水平扩展与性能提升,同时最小化对业务代码的影响。
分库数量需综合考虑单库处理能力、查询性能及硬件投入。MySQL单库建议不超过5000万条记录,Oracle不超过1亿条记录。分库过少无法有效分散压力,过多则增加跨库访问复杂度及硬件成本。初次分库建议4~8个,实践中6个分库可满足多数业务需求。
分库逻辑应尽量对上层业务透明,通过数据访问层(DAL)处理路由:
分布式数据访问层(DDAL)可基于持久化框架(如iBatis)封装实现,不建议直接改造JDBC驱动层。
跨库分页需遍历所有分库,性能消耗较大:
通过Lookup表解决非分库字段(如订单ID)的查询问题:
典型分库架构包含以下组件:
分阶段上线降低风险:
从6库扩展至12库的操作流程:
若现有数据库存在性能瓶颈,可评估以下改造方向: