From 22d78b2dd6c3f47082128db82b55e759bb0db1d7 Mon Sep 17 00:00:00 2001 From: Yvan <8574526@qq,com> Date: Thu, 5 Nov 2026 01:57:06 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E9=81=BF=E5=85=8D=E5=85=85=E5=80=BCID?= =?UTF-8?q?=E6=8E=92=E5=BA=8F=E8=AF=AF=E7=94=A8=E4=B8=BB=E9=94=AE=E6=89=AB?= =?UTF-8?q?=E6=8F=8F=E5=8E=86=E5=8F=B2=E6=B5=81=E6=B0=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/data/business/ledger.go | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/internal/data/business/ledger.go b/internal/data/business/ledger.go index 4889c41..bbd8378 100644 --- a/internal/data/business/ledger.go +++ b/internal/data/business/ledger.go @@ -297,9 +297,20 @@ func (r *ledgerRepo) Spends(ctx context.Context, scope business.LedgerScope, fil } 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) - 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 } meta := []ledgerMetaTarget{}