perf(core): Wave 2 part1 — 复合索引(只生成不apply) + 消息中心 N+1 治理
索引(只 makemigrations 看 SQL,远程 MySQL apply 留用户低峰 / rule 3):
- Asset (team,category,-created_at)+(team,asset_type)、CreditLedger (team,-created_at)+
(team,ledger_type,created_at)、Project (team,-updated_at)、AITask (team,-created_at)、
Product (team,-created_at);迁移 assets0005/billing0002/projects0004/ai0008/products0002
消息中心 N+1(ops/views.py):
- type_counts 原 6 次 count(每请求)→ 一次 aggregate(Count(filter=...)) 条件聚合
- ensure_team_notifications 项目花费原逐项目 aggregate(N+1)→ 一次 values('project').annotate(Sum)
验证: apps.ops 测试 3/3 OK;全量 6fail+1err 均为预存 image provider 路由失败(stash 跑 baseline
复现)= 零新增回归;索引迁移在 sqlite 测试库成功 apply
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
42c3c046ea
commit
99a442e883
@@ -0,0 +1,21 @@
|
||||
# Generated by Django 5.1.15 on 2026-06-18 20:13
|
||||
|
||||
from django.conf import settings
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('accounts', '0002_loginsession_userpreference'),
|
||||
('ai', '0007_switch_image_to_yunqi'),
|
||||
('projects', '0003_scriptsegment_dialogue'),
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddIndex(
|
||||
model_name='aitask',
|
||||
index=models.Index(fields=['team', '-created_at'], name='ai_aitask_team_id_570138_idx'),
|
||||
),
|
||||
]
|
||||
@@ -100,6 +100,8 @@ class AITask(TeamOwnedModel):
|
||||
models.Index(fields=["team", "status"]),
|
||||
models.Index(fields=["project", "task_type"]),
|
||||
models.Index(fields=["provider_task_id"]),
|
||||
# 任务历史默认按团队 + 创建时间倒序(AI 工具页 / asset-factory)
|
||||
models.Index(fields=["team", "-created_at"]),
|
||||
]
|
||||
|
||||
def __str__(self) -> str:
|
||||
|
||||
Reference in New Issue
Block a user