一、当前数据库结构分析
快驴生鲜作为B2B生鲜供应链平台,当前数据库可能存在以下问题:
- 高并发写入导致的性能瓶颈(订单、库存等)
- 复杂查询响应时间长(商品检索、供应商分析等)
- 数据一致性维护困难(多环节业务协同)
- 扩展性不足(业务快速增长需求)
二、核心表结构优化设计
1. 商品中心优化
```sql
-- 商品主表(分库分表关键表)
CREATE TABLE product (
product_id BIGINT PRIMARY KEY AUTO_INCREMENT,
product_code VARCHAR(32) NOT NULL COMMENT 商品编码,
name VARCHAR(128) NOT NULL COMMENT 商品名称,
category_id BIGINT NOT NULL COMMENT 分类ID,
spec_id BIGINT NOT NULL COMMENT 规格ID,
unit VARCHAR(16) NOT NULL COMMENT 单位,
status TINYINT DEFAULT 1 COMMENT 状态,
create_time DATETIME NOT NULL,
update_time DATETIME NOT NULL,
INDEX idx_category (category_id),
INDEX idx_code (product_code)
) PARTITION BY RANGE (product_id) (
PARTITION p0 VALUES LESS THAN (1000000),
PARTITION p1 VALUES LESS THAN (2000000),
-- 更多分区...
);
-- 商品规格表(支持多规格)
CREATE TABLE product_spec (
spec_id BIGINT PRIMARY KEY AUTO_INCREMENT,
spec_name VARCHAR(64) NOT NULL COMMENT 规格名称,
attributes JSON NOT NULL COMMENT 规格属性JSON,
weight DECIMAL(10,3) COMMENT 重量(kg),
volume DECIMAL(10,3) COMMENT 体积(m³)
);
```
2. 库存管理优化
```sql
-- 分布式库存表(按仓库分表)
CREATE TABLE inventory (
inventory_id BIGINT PRIMARY KEY AUTO_INCREMENT,
product_id BIGINT NOT NULL,
warehouse_id INT NOT NULL,
total_stock INT NOT NULL COMMENT 总库存,
available_stock INT NOT NULL COMMENT 可用库存,
locked_stock INT DEFAULT 0 COMMENT 锁定库存,
last_update_time DATETIME NOT NULL,
UNIQUE KEY uk_product_warehouse (product_id, warehouse_id),
INDEX idx_warehouse (warehouse_id)
) PARTITION BY LIST (warehouse_id) (
PARTITION p_wh1 VALUES IN (1,2,3),
PARTITION p_wh2 VALUES IN (4,5,6)
-- 更多分区...
);
-- 库存变动日志(时间序列数据)
CREATE TABLE inventory_log (
log_id BIGINT PRIMARY KEY AUTO_INCREMENT,
inventory_id BIGINT NOT NULL,
change_type TINYINT NOT NULL COMMENT 1-入库 2-出库 3-调拨等,
change_quantity INT NOT NULL,
before_stock INT NOT NULL,
after_stock INT NOT NULL,
operator_id BIGINT COMMENT 操作人ID,
create_time DATETIME NOT NULL,
INDEX idx_product_time (product_id, create_time),
INDEX idx_time (create_time)
) ENGINE=InnoDB ROW_FORMAT=COMPRESSED;
```
3. 订单系统优化
```sql
-- 订单主表(按时间分表)
CREATE TABLE orders (
order_id BIGINT PRIMARY KEY AUTO_INCREMENT,
order_no VARCHAR(32) NOT NULL COMMENT 订单编号,
customer_id BIGINT NOT NULL,
total_amount DECIMAL(12,2) NOT NULL,
status TINYINT NOT NULL COMMENT 订单状态,
delivery_time DATETIME COMMENT 要求送达时间,
create_time DATETIME NOT NULL,
update_time DATETIME NOT NULL,
INDEX idx_customer (customer_id),
INDEX idx_status_time (status, create_time)
) PARTITION BY RANGE (TO_DAYS(create_time)) (
PARTITION p202301 VALUES LESS THAN (TO_DAYS(2023-02-01)),
PARTITION p202302 VALUES LESS THAN (TO_DAYS(2023-03-01))
-- 更多分区...
);
-- 订单明细表(与订单表按订单ID关联)
CREATE TABLE order_items (
item_id BIGINT PRIMARY KEY AUTO_INCREMENT,
order_id BIGINT NOT NULL,
product_id BIGINT NOT NULL,
spec_id BIGINT NOT NULL,
quantity INT NOT NULL,
price DECIMAL(12,2) NOT NULL,
actual_price DECIMAL(12,2) NOT NULL,
status TINYINT DEFAULT 0 COMMENT 明细状态,
INDEX idx_order (order_id),
INDEX idx_product (product_id)
);
```
三、关键优化策略
1. 分库分表策略
- 水平分表:按业务增长快的表(如订单、库存)按时间或ID范围分区
- 垂直分库:按业务域拆分(商品库、订单库、用户库等)
- 分片键选择:
- 商品表:product_id
- 订单表:order_id + create_time
- 库存表:product_id + warehouse_id
2. 索引优化
- 复合索引:WHERE条件+排序字段组合
- 覆盖索引:查询字段全部包含在索引中
- 避免过度索引:高频写入表控制索引数量
3. 缓存策略
- 热点数据缓存:商品详情、库存等使用Redis
- 多级缓存:本地缓存+分布式缓存
- 缓存策略:
- 商品信息:LRU+TTL
- 库存数据:实时性要求高,采用小TTL+主动刷新
4. 读写分离
- 主库负责写操作
- 从库负责读操作
- 中间件实现自动路由(如MyCat、ShardingSphere)
5. 事务优化
- 避免长事务
- 拆分大事务为多个小事务
- 最终一致性方案替代强一致性(如库存预扣)
四、高级特性应用
1. 数据库中间件
- 使用ShardingSphere实现分库分表
- 读写分离配置
- 分布式事务支持
2. 时序数据库应用
- 对于库存变动、温度监控等时序数据,使用TDengine等时序数据库
3. 搜索引擎集成
- 商品搜索使用Elasticsearch
- 支持模糊查询、排序、聚合等复杂查询
4. 异步处理机制
- 库存扣减采用消息队列异步处理
- 订单状态变更通过事件驱动架构
五、监控与维护
1. 性能监控:
- 慢查询日志分析
- 连接数监控
- 锁等待监控
2. 定期维护:
- 统计信息更新
- 索引优化
- 历史数据归档
3. 扩容方案:
- 垂直扩容:升级服务器配置
- 水平扩容:增加分片数量
- 读写分离节点扩展
六、实施路线图
1. 第一阶段(1个月):
- 完成核心表结构重构
- 实现分库分表策略
- 搭建读写分离环境
2. 第二阶段(2个月):
- 引入缓存层
- 实现异步处理机制
- 集成搜索引擎
3. 第三阶段(持续):
- 性能调优
- 监控体系完善
- 根据业务发展调整分片策略
通过以上优化,快驴生鲜系统可显著提升数据库性能,支撑高并发业务场景,同时保证数据一致性和系统可扩展性。