一、当前数据库结构问题分析
1. 表结构不合理:
- 商品表与库存表未分离,导致频繁更新的库存数据影响商品查询性能
- 订单表与订单详情表关联设计不够高效
- 用户地址信息冗余存储在订单表中
2. 索引设计缺陷:
- 缺少复合索引,高频查询场景效率低
- 索引未覆盖常用筛选条件组合
- 大表上存在过多索引影响写入性能
3. 数据冗余问题:
- 商品分类信息重复存储在多个表中
- 供应商信息在商品表和采购表中重复
4. 分区策略缺失:
- 订单表等大表未按时间或业务维度分区
- 日志类数据未单独存储
二、优化后的数据库结构设计
1. 核心表结构优化
```sql
-- 商品基础信息表(去冗余)
CREATE TABLE product_base (
product_id BIGINT PRIMARY KEY,
product_name VARCHAR(100) NOT NULL,
category_id BIGINT NOT NULL,
supplier_id BIGINT NOT NULL,
spec VARCHAR(50),
unit VARCHAR(20),
is_active BOOLEAN DEFAULT TRUE,
create_time DATETIME,
update_time DATETIME
);
-- 商品库存表(独立高频更新表)
CREATE TABLE product_stock (
stock_id BIGINT PRIMARY KEY AUTO_INCREMENT,
product_id BIGINT NOT NULL UNIQUE,
total_stock INT NOT NULL DEFAULT 0,
available_stock INT NOT NULL DEFAULT 0,
locked_stock INT NOT NULL DEFAULT 0,
warning_threshold INT DEFAULT 10,
update_time DATETIME,
FOREIGN KEY (product_id) REFERENCES product_base(product_id)
);
-- 订单主表(精简字段)
CREATE TABLE orders (
order_id BIGINT PRIMARY KEY,
user_id BIGINT NOT NULL,
order_no VARCHAR(32) NOT NULL UNIQUE,
total_amount DECIMAL(12,2) NOT NULL,
payment_amount DECIMAL(12,2) NOT NULL,
status TINYINT NOT NULL COMMENT 1-待支付 2-已支付 3-已发货 4-已完成 5-已取消,
payment_time DATETIME,
delivery_time DATETIME,
complete_time DATETIME,
create_time DATETIME NOT NULL,
update_time DATETIME NOT NULL,
INDEX idx_user_status (user_id, status),
INDEX idx_create_status (create_time, status)
);
-- 订单详情表(独立存储)
CREATE TABLE order_items (
item_id BIGINT PRIMARY KEY AUTO_INCREMENT,
order_id BIGINT NOT NULL,
product_id BIGINT NOT NULL,
product_name VARCHAR(100) NOT NULL,
product_spec VARCHAR(50),
unit_price DECIMAL(10,2) NOT NULL,
quantity INT NOT NULL,
subtotal DECIMAL(12,2) NOT NULL,
FOREIGN KEY (order_id) REFERENCES orders(order_id),
FOREIGN KEY (product_id) REFERENCES product_base(product_id),
INDEX idx_order (order_id)
);
```
2. 索引优化方案
1. 高频查询场景索引:
- 商品搜索:`(product_name, category_id)` 复合索引
- 库存预警:`(available_stock, warning_threshold)` 索引
- 订单状态查询:`(status, create_time)` 复合索引
2. 覆盖索引设计:
- 商品列表页查询:`(category_id, is_active, update_time)` 包含索引
- 订单历史查询:`(user_id, status, create_time)` 覆盖索引
3. 索引维护策略:
- 定期分析索引使用率,删除未使用索引
- 对大表索引进行分区维护
- 避免在频繁更新的列上建索引
3. 分区与分表策略
1. 订单表分区:
```sql
CREATE TABLE orders (
-- 表结构同上
) 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)),
-- 其他月份分区...
PARTITION pmax VALUES LESS THAN MAXVALUE
);
```
2. 日志表分表:
- 按日期分表:`operation_log_202301`, `operation_log_202302`...
- 或使用分库分表中间件(如ShardingSphere)
4. 缓存层设计
1. 热点数据缓存:
- 商品详情缓存(Redis Hash结构)
- 分类商品列表缓存(Redis Sorted Set)
- 库存预警阈值缓存
2. 缓存策略:
- 写后缓存(Cache-Aside模式)
- 设置合理的TTL(如商品信息10分钟,库存1分钟)
- 库存变更使用消息队列通知缓存更新
三、实施步骤建议
1. 阶段一:基础优化(1-2周)
- 完成表结构重构
- 建立核心索引
- 实现基础数据迁移
2. 阶段二:性能优化(2-4周)
- 实施分区策略
- 部署缓存层
- 优化高频查询SQL
3. 阶段三:监控与调优(持续)
- 建立数据库监控体系
- 定期进行性能测试
- 根据业务发展持续优化
四、预期优化效果
1. 查询性能提升:
- 商品列表查询响应时间减少60%+
- 订单历史查询速度提升3-5倍
- 库存查询延迟控制在10ms以内
2. 系统稳定性增强:
- 减少数据库锁等待
- 降低I/O压力
- 提高高并发场景下的吞吐量
3. 维护成本降低:
- 数据结构更清晰
- 扩展性更强
- 故障排查更高效
建议在实际实施前进行充分的测试,特别是在数据迁移阶段要做好备份和回滚方案。对于已上线的生产系统,可以考虑采用灰度发布的方式逐步切换。