一、当前数据库结构问题分析
1. 表结构不合理:
- 商品信息分散在多个表中,查询效率低下
- 订单相关表关联复杂,存在冗余数据
- 库存管理缺乏实时性设计
2. 性能瓶颈:
- 高并发场景下查询响应慢
- 复杂报表生成耗时过长
- 索引设计不完善导致全表扫描
3. 扩展性问题:
- 难以支持新业务快速接入
- 数据分区策略缺失
- 缺乏水平扩展能力
二、优化目标
1. 提高系统响应速度和吞吐量
2. 降低数据库运维复杂度
3. 支持业务快速迭代和扩展
4. 确保数据一致性和可靠性
三、优化方案设计
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,
supplier_id BIGINT NOT NULL,
base_unit VARCHAR(16) NOT NULL,
status TINYINT DEFAULT 1 COMMENT 1-上架,0-下架,
create_time DATETIME NOT NULL,
update_time DATETIME NOT NULL
);
CREATE TABLE product_detail (
product_id BIGINT PRIMARY KEY,
description TEXT,
specifications JSON,
storage_conditions VARCHAR(255),
shelf_life INT COMMENT 保质期(天),
FOREIGN KEY (product_id) REFERENCES product_main(product_id)
);
CREATE TABLE product_price (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
product_id BIGINT NOT NULL,
price DECIMAL(10,2) NOT NULL,
cost_price DECIMAL(10,2) NOT NULL,
market_price DECIMAL(10,2),
start_time DATETIME NOT NULL,
end_time DATETIME,
is_current BOOLEAN DEFAULT TRUE,
UNIQUE KEY (product_id, is_current),
FOREIGN KEY (product_id) REFERENCES product_main(product_id)
);
```
订单系统优化:
```sql
-- 订单主表
CREATE TABLE order_main (
order_id BIGINT PRIMARY KEY,
order_no VARCHAR(32) NOT NULL UNIQUE,
user_id BIGINT NOT NULL,
warehouse_id BIGINT NOT NULL,
total_amount DECIMAL(12,2) NOT NULL,
payment_amount DECIMAL(12,2) NOT NULL,
status TINYINT NOT NULL COMMENT 订单状态,
payment_time DATETIME,
delivery_time DATETIME,
create_time DATETIME NOT NULL,
update_time DATETIME NOT NULL,
INDEX idx_user (user_id),
INDEX idx_status (status),
INDEX idx_create_time (create_time)
);
-- 订单商品明细
CREATE TABLE order_item (
id BIGINT AUTO_INCREMENT PRIMARY KEY,
order_id BIGINT NOT NULL,
product_id BIGINT NOT NULL,
product_name VARCHAR(128) NOT NULL,
quantity INT NOT NULL,
unit_price DECIMAL(10,2) NOT NULL,
total_price DECIMAL(12,2) NOT NULL,
batch_no VARCHAR(32) COMMENT 批次号,
expiry_date DATE COMMENT 保质期截止日,
INDEX idx_order (order_id),
FOREIGN KEY (order_id) REFERENCES order_main(order_id)
);
```
2. 索引优化策略
1. 核心查询场景索引:
- 商品搜索:在商品名称、分类、供应商等字段建立复合索引
- 订单查询:按用户ID、订单状态、时间范围建立索引
- 库存查询:按仓库ID、商品ID、批次号建立索引
2. 索引优化示例:
```sql
-- 商品搜索复合索引
ALTER TABLE product_main ADD INDEX idx_search (product_name, category_id, supplier_id);
-- 订单状态和时间范围索引
ALTER TABLE order_main ADD INDEX idx_status_time (status, create_time);
-- 库存查询索引
ALTER TABLE inventory ADD INDEX idx_stock (warehouse_id, product_id, batch_no);
```
3. 分库分表策略
1. 水平分表方案:
- 订单表按时间分表:`order_main_202301`, `order_main_202302`...
- 商品表按品类分表:`product_meat`, `product_vegetable`...
2. 分库策略:
- 按地区分库:华东库、华北库、华南库等
- 按业务分库:商品库、订单库、用户库
4. 缓存策略设计
1. 多级缓存架构:
- Redis集群:存储热点数据、会话信息
- 本地缓存:应用服务器内存缓存
- CDN缓存:静态资源缓存
2. 缓存策略示例:
```java
// 商品详情缓存示例
public ProductDetail getProductDetail(Long productId) {
// 1. 先查本地缓存
ProductDetail localCache = localCache.get(productId);
if (localCache != null) return localCache;
// 2. 查Redis缓存
ProductDetail redisCache = redis.get("product:" + productId);
if (redisCache != null) {
localCache.put(productId, redisCache);
return redisCache;
}
// 3. 查数据库
ProductDetail dbData = db.queryProductDetail(productId);
if (dbData != null) {
redis.setex("product:" + productId, 3600, dbData); // 1小时过期
localCache.put(productId, dbData);
}
return dbData;
}
```
5. 读写分离实现
1. 主从架构设计:
- 主库:负责写操作
- 从库:负责读操作
- 配置一主多从,提高读性能
2. 应用层实现:
```java
// 使用ShardingSphere实现读写分离
@Bean
public DataSource dataSource() throws SQLException {
Map dataSourceMap = new HashMap<>();
// 配置主库
HikariDataSource masterDataSource = new HikariDataSource();
masterDataSource.setJdbcUrl("jdbc:mysql://master:3306/kuailv");
// 其他配置...
// 配置从库
HikariDataSource slave1DataSource = new HikariDataSource();
slave1DataSource.setJdbcUrl("jdbc:mysql://slave1:3306/kuailv");
// 其他配置...
dataSourceMap.put("master", masterDataSource);
dataSourceMap.put("slave1", slave1DataSource);
// 配置读写分离规则
MasterSlaveRuleConfiguration masterSlaveRuleConfig = new MasterSlaveRuleConfiguration(
"ds_master_slave", "master", Arrays.asList("slave1"));
return MasterSlaveDataSourceFactory.createDataSource(
dataSourceMap, masterSlaveRuleConfig, new HashMap<>());
}
```
四、实施步骤
1. 评估与规划:
- 分析当前业务量和增长趋势
- 评估现有数据库性能瓶颈
- 制定分阶段优化计划
2. 数据迁移:
- 设计数据迁移方案
- 开发迁移工具
- 执行数据迁移并验证
3. 系统切换:
- 并行运行新旧系统
- 逐步切换流量
- 监控系统运行状态
4. 优化验证:
- 压力测试验证性能提升
- 监控关键指标(QPS、RT、错误率)
- 收集用户反馈
五、预期效果
1. 性能提升:
- 复杂查询响应时间缩短50%以上
- 高并发场景下吞吐量提升3-5倍
- 报表生成速度提升10倍
2. 可维护性提升:
- 表结构更清晰,易于扩展
- 索引设计更合理,减少全表扫描
- 数据库运维工作量减少30%
3. 业务支持能力增强:
- 支持更复杂的促销活动
- 更容易接入新业务场景
- 具备更好的水平扩展能力
六、后续优化建议
1. 引入数据库中间件(如ShardingSphere)实现分库分表
2. 考虑使用NewSQL数据库应对超大规模数据
3. 建立完善的数据库监控体系
4. 定期进行数据库性能调优和索引优化
5. 制定数据库备份和恢复策略
通过以上优化方案,快驴生鲜系统的数据库性能将得到显著提升,为业务快速发展提供坚实的数据支撑。