一、生鲜系统数据库设计核心挑战
生鲜电商系统(如美菜)的数据库设计面临独特挑战:
- 高并发写入:订单、库存、物流数据实时更新
- 冷热数据混合:历史交易数据与实时业务数据并存
- 多维度查询:按商品、时间、区域、供应商等多条件组合查询
- 数据一致性要求:库存扣减、财务结算等场景的强一致性需求
二、核心优化方向
1. 数据库架构选型
- 分库分表策略:
- 按业务域拆分(订单库、商品库、用户库)
- 水平分表:按时间(月/年)或ID范围拆分大表
- 案例:美菜订单表按城市ID哈希分库,解决单库数据量过大问题
- 读写分离:
- 主库负责写操作,多个从库处理读请求
- 使用中间件(如MyCat、ShardingSphere)实现透明路由
2. 表结构优化
- 商品表设计:
```sql
CREATE TABLE product (
id BIGINT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
category_id BIGINT,
supplier_id BIGINT,
base_unit VARCHAR(20), -- 基本单位(个/kg)
spec VARCHAR(50), -- 规格(500g/箱)
conversion_rate DECIMAL(10,3), -- 单位换算率
status TINYINT DEFAULT 1,
create_time DATETIME,
update_time DATETIME,
INDEX idx_category (category_id),
INDEX idx_supplier (supplier_id)
);
```
- 库存表设计(解决超卖问题):
```sql
CREATE TABLE inventory (
id BIGINT 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, -- 乐观锁版本号
UNIQUE KEY uk_product_warehouse (product_id, warehouse_id),
INDEX idx_available (available_stock)
);
```
3. 索引优化策略
- 组合索引设计:
- 订单查询常用组合:`INDEX idx_user_status_time (user_id, status, create_time)`
- 避免过度索引:每个表索引数控制在5个以内
- 索引使用监控:
- 定期分析慢查询日志
- 使用`EXPLAIN`验证索引使用情况
- 对高频查询建立覆盖索引
4. 事务与锁优化
- 库存扣减方案:
```java
// 乐观锁实现示例
public boolean deductStock(Long productId, Long warehouseId, int quantity) {
int retryTimes = 3;
while (retryTimes-- > 0) {
Inventory inventory = inventoryDao.selectByProductAndWarehouse(productId, warehouseId);
if (inventory.getAvailableStock() < quantity) {
return false;
}
int affected = inventoryDao.updateWithVersion(
productId, warehouseId,
inventory.getVersion(),
inventory.getAvailableStock() - quantity
);
if (affected > 0) {
return true;
}
}
return false;
}
```
- 分布式事务处理:
- 订单支付与库存扣减采用TCC模式
- 使用Seata等分布式事务框架
5. 缓存策略
- 多级缓存架构:
- 本地缓存(Caffeine):热点商品数据
- 分布式缓存(Redis):商品详情、库存快照
- 缓存策略:
- 库存数据设置短TTL(如5秒)
- 商品基本信息设置长TTL(如1小时)
- 缓存穿透/雪崩防护:
- 空值缓存
- 互斥锁防止缓存击穿
- 随机过期时间防止雪崩
6. 数据归档与冷热分离
- 历史数据归档:
- 每月将超过6个月的订单数据归档到历史库
- 使用分区表按时间范围管理
- 冷热数据访问优化:
- 实时查询走主库
- 统计报表查询走归档库
三、性能监控与调优
1. 监控指标:
- QPS/TPS
- 连接池使用率
- 慢查询比例
- 缓存命中率
2. 调优工具:
- Percona Toolkit分析表碎片
- pt-query-digest分析慢查询
- Prometheus+Grafana监控告警
3. 定期维护:
- 每月执行`ANALYZE TABLE`更新统计信息
- 每季度执行`OPTIMIZE TABLE`整理碎片
四、美菜特定场景优化
1. 供应链场景优化:
- 采购单与入库单关联查询优化
- 供应商结算表设计考虑财务对账需求
2. 物流场景优化:
- 配送路线表的空间索引优化
- 实时位置数据采用时序数据库存储
3. 促销活动优化:
- 秒杀活动专用库存表
- 预计算促销规则结果缓存
五、新技术应用
1. NewSQL数据库:
- 考虑TiDB等分布式数据库解决水平扩展问题
2. 时序数据库:
- 使用InfluxDB存储温湿度等传感器数据
3. 图数据库:
- Neo4j存储商品关联关系,支持智能推荐
通过以上优化策略,美菜生鲜系统能够在保证数据一致性的前提下,支撑每日数百万订单处理,实现99.95%的系统可用性,并将平均查询响应时间控制在200ms以内。