-- /wallet/wallet-rule-transaction/page-join 分页、准确计数及当前页详情索引。 -- 先发布配套 SQL 改造才能消除 GROUP BY 和 biz_id 的隐式数字转换。 -- 请在 pjcloudx_wallet 库核对 SHOW INDEX;同名同列索引已存在时跳过对应语句, -- 同名但定义不同应先核实。大表低峰逐条执行,观察 IO 和复制延迟。 -- LOCK=NONE 仍需要短暂元数据锁;执行前排查长事务,勿并发创建索引。 -- 默认列表、时间范围、COUNT;等值前缀后按 create_time/id 反向扫描。 ALTER TABLE pjcloudx_wallet.wallet_rule_transaction ADD INDEX idx_wrt_tenant_del_ct_id (tenant_id, del_flag, create_time, id), ALGORITHM=INPLACE, LOCK=NONE; -- 按转账类型筛选时仍保持稳定时间排序,并使该条件的 COUNT 使用覆盖索引。 ALTER TABLE pjcloudx_wallet.wallet_rule_transaction ADD INDEX idx_wrt_tenant_del_biz_ct_id (tenant_id, del_flag, biz_type, create_time, id), ALGORITHM=INPLACE, LOCK=NONE; -- 退款/未退款状态查询:避免准确计数时扫描并回表全部转账记录。 ALTER TABLE pjcloudx_wallet.wallet_rule_transaction ADD INDEX idx_wrt_tenant_del_refund_ct_id (tenant_id, del_flag, is_refund, create_time, id), ALGORITHM=INPLACE, LOCK=NONE; -- 退回日期范围:该筛选不要求传 is_refund,使用独立的日期前缀。 ALTER TABLE pjcloudx_wallet.wallet_rule_transaction ADD INDEX idx_wrt_tenant_del_rt_ct_id (tenant_id, del_flag, refund_time, create_time, id), ALGORITHM=INPLACE, LOCK=NONE; -- EXISTS 和当前页流水定位;biz_type 是 TINYTEXT,必须使用前缀长度。 -- 必须保留 biz_id 的精确字符串等值条件;SIGNED 等值仅用于反向主键定位,不能替代它。 ALTER TABLE pjcloudx_wallet.wallet_transaction ADD INDEX idx_wt_tenant_bizid_type (tenant_id, biz_id, biz_type(8)), ALGORITHM=INPLACE, LOCK=NONE; -- 部门树、部门权限的流水存在性判断;也覆盖按租户/类型筛选的子查询。 ALTER TABLE pjcloudx_wallet.wallet_transaction ADD INDEX idx_wt_tenant_type_dept_bizid (tenant_id, biz_type(8), dept_id, biz_id, user_id), ALGORITHM=INPLACE, LOCK=NONE; -- 执行后用实际租户和日期 EXPLAIN 验证: -- SELECT a.id FROM wallet_rule_transaction a -- WHERE a.tenant_id = ? AND a.del_flag = '0' -- AND a.create_time BETWEEN ? AND ? -- ORDER BY a.create_time DESC, a.id DESC LIMIT 10; -- 预期使用 idx_wrt_tenant_del_ct_id,无临时表和 filesort。 -- SELECT MIN(t.id) FROM wallet_transaction t -- WHERE t.tenant_id = ? AND t.biz_id = ? AND t.biz_type = '6'; -- 预期使用 idx_wt_tenant_bizid_type,通过业务编号定位少量流水。