yumi-golang/migrations/062_yumi_game_king_dual_ranking_daily_limit.sql
2026-07-22 18:54:53 +08:00

68 lines
3.4 KiB
SQL

-- Yumi Game King: real winning-income ranking, separate reward configs, and daily chance cap.
--
-- Performance review:
-- 1. Activity/rank-reward/settlement are small configuration/result tables; their ALTERs are
-- bounded metadata/index rebuilds and do not touch the 35M-row task archive.
-- 2. User aggregate ALTERs add two narrow columns plus ranking indexes. Run during low traffic:
-- MySQL builds each index once; online DDL keeps reads/writes available with LOCK=NONE.
-- 3. No historical ledger is scanned or backfilled here. New winning rows arrive from the
-- canonical GAME_WIN_GOLD event. The daily-user index makes chance sums proportional to one
-- user's active dates instead of all activity participants.
-- 4. Existing six TYCOON reward rows are copied once to VICTORIOUS so old activities remain
-- editable; operators can replace each board's six resource groups before enabling.
ALTER TABLE `yumi_game_king_activity`
ADD COLUMN `daily_chance_limit` INT NOT NULL DEFAULT 10 AFTER `coin_per_draw`,
ALGORITHM=INSTANT;
ALTER TABLE `yumi_game_king_rank_reward`
DROP INDEX `uk_yumi_gk_rank_range`,
DROP INDEX `idx_yumi_gk_rank_start`,
ADD COLUMN `ranking_type` VARCHAR(32) NOT NULL DEFAULT 'TYCOON' AFTER `activity_id`,
ADD UNIQUE KEY `uk_yumi_gk_rank_range` (`activity_id`, `ranking_type`, `start_rank`, `end_rank`),
ADD KEY `idx_yumi_gk_rank_start` (`activity_id`, `ranking_type`, `start_rank`),
ALGORITHM=INPLACE, LOCK=NONE;
INSERT INTO `yumi_game_king_rank_reward` (
`id`, `activity_id`, `ranking_type`, `start_rank`, `end_rank`, `resource_group_id`,
`reward_name`, `reward_items_json`, `create_time`, `update_time`
)
SELECT UUID_SHORT(), `activity_id`, 'VICTORIOUS', `start_rank`, `end_rank`, `resource_group_id`,
`reward_name`, `reward_items_json`, `create_time`, `update_time`
FROM `yumi_game_king_rank_reward`
WHERE `ranking_type` = 'TYCOON';
ALTER TABLE `yumi_game_king_consume_ledger`
ADD COLUMN `event_type` VARCHAR(32) NOT NULL DEFAULT 'GAME_CONSUME_GOLD' AFTER `sys_origin`,
ALGORITHM=INSTANT;
ALTER TABLE `yumi_game_king_user`
ADD COLUMN `total_won` BIGINT NOT NULL DEFAULT 0 AFTER `total_consumed`,
ADD COLUMN `win_reached_time` DATETIME(3) NULL AFTER `consume_reached_time`,
ADD KEY `idx_yumi_gk_user_win_rank` (
`activity_id`, `total_won` DESC, `win_reached_time` ASC, `user_id` ASC
),
ALGORITHM=INPLACE, LOCK=NONE;
ALTER TABLE `yumi_game_king_user_daily`
ADD COLUMN `total_won` BIGINT NOT NULL DEFAULT 0 AFTER `total_consumed`,
ADD COLUMN `win_reached_time` DATETIME(3) NULL AFTER `consume_reached_time`,
ADD KEY `idx_yumi_gk_daily_user_chance` (`activity_id`, `user_id`, `stat_date`),
ADD KEY `idx_yumi_gk_daily_win_rank` (
`activity_id`, `stat_date`, `total_won` DESC, `win_reached_time` ASC, `user_id` ASC
),
ALGORITHM=INPLACE, LOCK=NONE;
ALTER TABLE `yumi_game_king_settlement_record`
DROP INDEX `uk_yumi_gk_settle_user`,
DROP INDEX `uk_yumi_gk_settle_rank`,
ADD COLUMN `ranking_type` VARCHAR(32) NOT NULL DEFAULT 'TYCOON' AFTER `activity_id`,
ADD COLUMN `score` BIGINT NOT NULL DEFAULT 0 AFTER `total_consumed`,
ADD UNIQUE KEY `uk_yumi_gk_settle_user` (`activity_id`, `ranking_type`, `user_id`),
ADD UNIQUE KEY `uk_yumi_gk_settle_rank` (`activity_id`, `ranking_type`, `rank_no`),
ALGORITHM=INPLACE, LOCK=NONE;
UPDATE `yumi_game_king_settlement_record`
SET `score` = `total_consumed`
WHERE `ranking_type` = 'TYCOON' AND `score` = 0;