perf: 修复 cards.go 和 users.go 中的 N+1 查询问题
cards.go: - 合并循环中的 Count 查询为单次 GROUP BY 查询 users.go: - 合并 ownApps 循环查询为单次 IN 查询 - 合并 agentApps 循环查询为批量查询 - 减少数据库查询次数从 O(n) 到 O(1)
This commit is contained in:
@@ -124,10 +124,32 @@ func handleGetCardTypes(c *gin.Context) {
|
||||
log.Printf("[DEBUG] CardType %d: ID=%d, Name=%s, ApplicationID=%v\n", i, ct.ID, ct.Name, ct.ApplicationID)
|
||||
}
|
||||
|
||||
cardTypeIDs := make([]uint, len(cardTypes))
|
||||
for i, ct := range cardTypes {
|
||||
cardTypeIDs[i] = ct.ID
|
||||
}
|
||||
|
||||
type CardCount struct {
|
||||
CardTypeID uint
|
||||
Count int64
|
||||
}
|
||||
var cardCounts []CardCount
|
||||
if len(cardTypeIDs) > 0 {
|
||||
database.DB.Model(&model.Card{}).
|
||||
Select("card_type_id, COUNT(*) as count").
|
||||
Where("card_type_id IN ?", cardTypeIDs).
|
||||
Group("card_type_id").
|
||||
Find(&cardCounts)
|
||||
}
|
||||
|
||||
countMap := make(map[uint]int64)
|
||||
for _, cc := range cardCounts {
|
||||
countMap[cc.CardTypeID] = cc.Count
|
||||
}
|
||||
|
||||
var cardTypesWithCount []map[string]interface{}
|
||||
for _, ct := range cardTypes {
|
||||
var count int64
|
||||
database.DB.Model(&model.Card{}).Where("card_type_id = ?", ct.ID).Count(&count)
|
||||
count := countMap[ct.ID]
|
||||
log.Printf("[DEBUG] CardType ID=%d, Name=%s, GeneratedCount=%d\n", ct.ID, ct.Name, count)
|
||||
|
||||
cardTypeMap := map[string]interface{}{
|
||||
|
||||
Reference in New Issue
Block a user