fix: 避免充值ID排序误用主键扫描历史流水
This commit is contained in:
@@ -297,9 +297,20 @@ func (r *ledgerRepo) Spends(ctx context.Context, scope business.LedgerScope, fil
|
|||||||
}
|
}
|
||||||
var pos []spendPO
|
var pos []spendPO
|
||||||
// 先在窄查询中选出当前页主键,再读取明细列,避免为排序读取整段流水。
|
// 先在窄查询中选出当前页主键,再读取明细列,避免为排序读取整段流水。
|
||||||
keysQuery := q.Select("r.id,r.source_db").Order(order).Order("r.id DESC,r.source_db ASC").Offset(options.Offset).Limit(options.Limit)
|
keysBase := q
|
||||||
|
tieOrder := "r.id DESC,r.source_db ASC"
|
||||||
|
if filter.SortField == "id" {
|
||||||
|
tieOrder = "r.source_db ASC"
|
||||||
|
if db.Dialector.Name() == "mysql" {
|
||||||
|
// LIMIT can make MySQL prefer scanning the primary key from its
|
||||||
|
// beginning, even when recent payments are near the end of history.
|
||||||
|
// Preserve selective time/scope indexes and sort the matching keys.
|
||||||
|
keysBase = q.Table("tab_spend r IGNORE INDEX FOR ORDER BY (PRIMARY)")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
keysQuery := keysBase.Select("r.id,r.source_db").Order(order).Order(tieOrder).Offset(options.Offset).Limit(options.Limit)
|
||||||
pageQuery := db.Table("tab_spend r").Joins("JOIN (?) page_ids ON page_ids.id=r.id AND page_ids.source_db=r.source_db", keysQuery)
|
pageQuery := db.Table("tab_spend r").Joins("JOIN (?) page_ids ON page_ids.id=r.id AND page_ids.source_db=r.source_db", keysQuery)
|
||||||
if err := pageQuery.Select("r.id,r.source_db,r.user_id,r.pay_order_number,r.game_id,r.game_name,r.server_id,r.server_name,r.game_player_name,r.pay_amount,r.pay_time,r.pay_way,r.pay_status,r.spend_ip,r.promote_id,r.promote_account").Order(order).Order("r.id DESC,r.source_db ASC").Scan(&pos).Error; err != nil {
|
if err := pageQuery.Select("r.id,r.source_db,r.user_id,r.pay_order_number,r.game_id,r.game_name,r.server_id,r.server_name,r.game_player_name,r.pay_amount,r.pay_time,r.pay_way,r.pay_status,r.spend_ip,r.promote_id,r.promote_account").Order(order).Order(tieOrder).Scan(&pos).Error; err != nil {
|
||||||
return nil, business.ErrStorage
|
return nil, business.ErrStorage
|
||||||
}
|
}
|
||||||
meta := []ledgerMetaTarget{}
|
meta := []ledgerMetaTarget{}
|
||||||
|
|||||||
Reference in New Issue
Block a user