💡 电商场景的致命痛点
当你的电商平台面临:
- 每日百万订单,
销售统计SQL
超时崩溃 - 大促时实时价格趋势图加载超时,用户流失
- 数据库被统计任务拖垮,核心交易功能受牵连
病根诊断:
实时扫描订单表
+ ORM全量加载
= 生产级灾难
🚀 四层架构优化(附电商代码)
1️⃣ 存储层:分库分表 + 冷热分离
// 订单表按年水平分表(2024_orders, 2025_orders...)
Schema::create('2024_orders', function (Blueprint $table) {
$table->timestamp('paid_at')->index(); // 支付时间
$table->unsignedBigInteger('product_id');
$table->decimal('amount', 10, 2);
});
// 迁移冷数据至分析库(ClickHouse)
Order::where('paid_at', '<', now()->subMonths(6))
->chunk(1000, function ($orders) {
ClickHouseOrder::insert($orders->toArray());
}); // 历史数据压缩存储
2️⃣ 计算层:预聚合霸权
// 创建商品统计中间表(避免实时扫描订单)
Schema::create('product_daily_stats', function (Blueprint $table) {
$table->date('stat_date');
$table->foreignId('product_id');
$table->integer('sold_count')->default(0); // 日销量
$table->decimal('avg_price', 10, 2); // 日均售价
$table->unique(['stat_date', 'product_id']);
});
// 定时任务:凌晨聚合数据
$schedule->command('stats:product-daily')
->dailyAt('03:00'); // 解放数据库白天压力
3️⃣ 查询层:精准狙击
// ❌ 死亡查询(扫描百万订单表)
Product::find($id)->orders()->whereDate('paid_at', $date)->avg('amount');
// ✅ 重生方案(毫秒响应)
ProductDailyStat::where('product_id', $id)
->where('stat_date', $date)
->value('avg_price'); // 命中预计算中间表
4️⃣ 缓存层:立体防御
// 热数据:Redis缓存实时看板
$dashboard = Cache::remember("dashboard:{$merchantId}", 60, function () {
return [
'today_sales' => ProductDailyStat::today()->sum('sold_count'),
'hot_products' => ProductDailyStat::today()->orderByDesc('sold_count')->take(10)->get()
];
});
// 冷数据:S3存储历史报表(低成本)
$csv = generate_sales_report_csv($startDate, $endDate);
Storage::disk('s3')->put("reports/{$merchantId}.csv", $csv);
⚡ 性能跃迁实测
场景 | 优化前 | 优化后 |
---|---|---|
商品30天销量曲线 | 8.5s | 65ms |
商家年度报表生成 | 2小时+ | 9分钟 |
大促期间数据库CPU峰值 | 100% | 35% |
💎 电商架构黄金法则
📌 100万订单以下 → MySQL索引 + 中间表
📌 100万~1亿订单 → 分表分区 + 预聚合
📌 超1亿订单/实时分析 → ClickHouse + Redis
📌 历史数据归档 → S3/OSS + 按需加载
📈 电商数据流架构
graph LR
A[订单支付] --> B[原始订单表]
B --> C{定时任务}
C --> D[预聚合中间表]
D --> E[实时看板 Redis]
D --> F[历史报表 S3]
E --> G[用户端API]
F --> G
血泪经验:
1️⃣ 禁止在Controller里直接计算->sum()
/->avg()
2️⃣ 用cursor()
替代->get()
,百万数据内存不崩
3️⃣ 大促期间关闭实时统计,预计算才是救世主