一、现状分析与优化目标
快驴生鲜作为B2B生鲜供应链平台,当前数据库面临以下挑战:
- 高并发订单处理能力不足
- 商品SKU管理复杂度高
- 库存实时性要求高
- 物流轨迹数据量大
- 供应商数据关联复杂
优化目标:
- 提升系统吞吐量30%以上
- 降低查询响应时间50%
- 确保数据强一致性
- 支持未来3年业务增长
二、核心表结构优化设计
1. 商品中心优化
```sql
-- 商品主表(分表设计)
CREATE TABLE product_main (
product_id BIGINT PRIMARY KEY,
product_code VARCHAR(32) NOT NULL UNIQUE,
product_name VARCHAR(128) NOT NULL,
category_id BIGINT NOT NULL,
brand_id BIGINT,
unit VARCHAR(16) NOT NULL,
spec VARCHAR(64),
status TINYINT DEFAULT 1 COMMENT 1-上架 0-下架,
create_time DATETIME(3) NOT NULL,
update_time DATETIME(3) NOT NULL,
INDEX idx_category (category_id),
INDEX idx_status (status)
) ENGINE=InnoDB PARTITION BY RANGE (product_id) (
PARTITION p0 VALUES LESS THAN (1000000),
PARTITION p1 VALUES LESS THAN (2000000),
-- 更多分区...
);
-- 商品扩展信息表(1:1关系)
CREATE TABLE product_ext (
product_id BIGINT PRIMARY KEY,
description TEXT,
storage_condition VARCHAR(64),
shelf_life INT COMMENT 保质期(天),
origin VARCHAR(128),
nutrition_info JSON,
FOREIGN KEY (product_id) REFERENCES product_main(product_id)
);
-- 商品价格表(按时间分区)
CREATE TABLE product_price (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
product_id BIGINT NOT NULL,
supplier_id BIGINT NOT NULL,
price DECIMAL(10,2) NOT NULL,
cost_price DECIMAL(10,2),
start_time DATETIME(3) NOT NULL,
end_time DATETIME(3),
status TINYINT DEFAULT 1,
INDEX idx_product_time (product_id, start_time),
INDEX idx_supplier (supplier_id)
) ENGINE=InnoDB PARTITION BY RANGE (UNIX_TIMESTAMP(start_time)) (
PARTITION p202301 VALUES LESS THAN (UNIX_TIMESTAMP(2023-02-01)),
PARTITION p202302 VALUES LESS THAN (UNIX_TIMESTAMP(2023-03-01)),
-- 更多分区...
);
```
2. 库存管理优化
```sql
-- 实时库存表(分库分表)
CREATE TABLE inventory (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
product_id BIGINT NOT NULL,
warehouse_id BIGINT NOT NULL,
total_stock INT NOT NULL DEFAULT 0,
available_stock INT NOT NULL DEFAULT 0,
locked_stock INT NOT NULL DEFAULT 0,
version INT NOT NULL DEFAULT 0 COMMENT 乐观锁版本,
update_time DATETIME(3) NOT NULL,
UNIQUE KEY uk_product_warehouse (product_id, warehouse_id),
INDEX idx_warehouse (warehouse_id)
) ENGINE=InnoDB PARTITION BY HASH(product_id) PARTITIONS 16;
-- 库存变动日志(时序数据库优化)
CREATE TABLE inventory_log (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
product_id BIGINT NOT NULL,
warehouse_id BIGINT NOT NULL,
change_type TINYINT NOT NULL COMMENT 1-入库 2-出库 3-调拨 4-盘点,
change_quantity INT NOT NULL,
before_stock INT NOT NULL,
after_stock INT NOT NULL,
order_no VARCHAR(64) COMMENT 关联订单号,
operator_id BIGINT,
operator_type TINYINT COMMENT 1-用户 2-系统,
create_time DATETIME(3) NOT NULL,
INDEX idx_product_time (product_id, create_time),
INDEX idx_warehouse_time (warehouse_id, create_time)
) ENGINE=InnoDB;
```
3. 订单系统优化
```sql
-- 订单主表(按时间分库)
CREATE TABLE orders (
order_id BIGINT PRIMARY KEY,
order_no VARCHAR(64) NOT NULL UNIQUE,
customer_id BIGINT NOT NULL,
warehouse_id BIGINT NOT NULL,
total_amount DECIMAL(12,2) NOT NULL,
pay_amount DECIMAL(12,2) NOT NULL,
status TINYINT NOT NULL DEFAULT 0 COMMENT 0-待支付 1-已支付 2-已发货 3-已完成 4-已取消,
payment_time DATETIME(3),
delivery_time DATETIME(3),
complete_time DATETIME(3),
create_time DATETIME(3) NOT NULL,
update_time DATETIME(3) NOT NULL,
INDEX idx_customer (customer_id),
INDEX idx_status_time (status, create_time)
) ENGINE=InnoDB PARTITION BY RANGE (UNIX_TIMESTAMP(create_time)) (
PARTITION p202301 VALUES LESS THAN (UNIX_TIMESTAMP(2023-02-01)),
PARTITION p202302 VALUES LESS THAN (UNIX_TIMESTAMP(2023-03-01)),
-- 更多分区...
);
-- 订单明细表(垂直拆分)
CREATE TABLE order_items (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
order_id BIGINT NOT NULL,
product_id BIGINT NOT NULL,
product_name VARCHAR(128) NOT NULL,
product_code VARCHAR(32) NOT NULL,
quantity INT NOT NULL,
price DECIMAL(10,2) NOT NULL,
cost_price DECIMAL(10,2),
status TINYINT DEFAULT 1,
FOREIGN KEY (order_id) REFERENCES orders(order_id)
);
```
三、关键优化策略
1. 分库分表策略
- 按业务维度分库:商品库、订单库、用户库等
- 按ID范围或哈希分表:解决单表数据量过大问题
- 冷热数据分离:历史订单归档到独立库
2. 索引优化
- 复合索引遵循最左前缀原则
- 高频查询字段单独建索引
- 定期分析慢查询并优化
3. 缓存策略
- Redis缓存热点商品数据
- 多级缓存架构:本地缓存→分布式缓存→数据库
- 缓存失效策略:主动刷新+被动失效
4. 读写分离
- 主库写,从库读
- 强制主库读场景:刚写入后立即查询
- 监控主从延迟
5. 事务优化
- 避免长事务
- 事务中只包含必要操作
- 合理设置事务隔离级别
四、高可用设计
1. 主从复制:一主多从架构
2. MTSL:多线程复制提高同步效率
3. 故障转移:自动检测主库故障并切换
4. 数据备份:每日全量备份+实时增量备份
5. 容灾方案:跨机房部署
五、实施路线图
1. 第一阶段(1个月):
- 完成现有数据迁移评估
- 搭建测试环境
- 实现核心表分库分表
2. 第二阶段(2个月):
- 逐步迁移历史数据
- 优化高频查询SQL
- 实现缓存层
3. 第三阶段(1个月):
- 性能测试与调优
- 监控系统部署
- 制定运维规范
六、预期效果
1. 查询性能提升:复杂查询响应时间从3s降至500ms内
2. 吞吐量提升:QPS从2000提升至6000+
3. 可用性提高:达到99.95%
4. 运维成本降低:自动化监控减少人工干预
七、注意事项
1. 迁移过程中确保数据一致性
2. 做好回滚方案
3. 逐步灰度发布,减少影响
4. 完善监控告警体系
5. 文档化所有变更
以上方案可根据快驴生鲜实际业务规模、团队技术栈和预算进行调整实施。