yumi-golang/migrations/063_yumi_game_king_daily_settlement.sql

58 lines
2.8 KiB
SQL

-- Yumi Game King: configurable DAILY Top1/Top2/Top3 rewards and idempotent daily settlement.
--
-- Performance review:
-- 1. rank_reward and settlement_record are bounded configuration/result tables. Their index
-- rebuilds do not scan the high-volume game-event ledger or task archive.
-- 2. Existing settlement rows are marked OVERALL by constant defaults; no aggregate backfill
-- or ranking sort is executed by this migration.
-- 3. The new period gate has one row per activity day. Its due-status index supports bounded
-- cron discovery, while the unique activity/date key makes repeated cron calls idempotent.
-- 4. Run the two ALTER statements during low traffic. LOCK=NONE keeps reads/writes available,
-- but MySQL still needs temporary space to rebuild the small secondary indexes.
ALTER TABLE `yumi_game_king_rank_reward`
DROP INDEX `uk_yumi_gk_rank_range`,
DROP INDEX `idx_yumi_gk_rank_start`,
ADD COLUMN `ranking_period` VARCHAR(32) NOT NULL DEFAULT 'OVERALL' AFTER `ranking_type`,
ADD UNIQUE KEY `uk_yumi_gk_rank_range` (
`activity_id`, `ranking_period`, `ranking_type`, `start_rank`, `end_rank`
),
ADD KEY `idx_yumi_gk_rank_start` (
`activity_id`, `ranking_period`, `ranking_type`, `start_rank`
),
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`,
DROP INDEX `idx_yumi_gk_settle_status`,
ADD COLUMN `ranking_period` VARCHAR(32) NOT NULL DEFAULT 'OVERALL' AFTER `ranking_type`,
ADD COLUMN `period_key` VARCHAR(32) NOT NULL DEFAULT 'OVERALL' AFTER `ranking_period`,
ADD COLUMN `stat_date` DATE NULL AFTER `period_key`,
ADD UNIQUE KEY `uk_yumi_gk_settle_user` (
`activity_id`, `period_key`, `ranking_type`, `user_id`
),
ADD UNIQUE KEY `uk_yumi_gk_settle_rank` (
`activity_id`, `period_key`, `ranking_type`, `rank_no`
),
ADD KEY `idx_yumi_gk_settle_status` (
`activity_id`, `ranking_period`, `period_key`, `delivery_status`
),
ALGORITHM=INPLACE, LOCK=NONE;
CREATE TABLE IF NOT EXISTS `yumi_game_king_period_settlement` (
`id` BIGINT NOT NULL,
`activity_id` BIGINT NOT NULL,
`period_type` VARCHAR(32) NOT NULL DEFAULT 'DAILY',
`period_key` VARCHAR(32) NOT NULL,
`stat_date` DATE NOT NULL,
`snapshot_due_time` DATETIME(3) NOT NULL,
`status` VARCHAR(32) NOT NULL DEFAULT 'PROCESSING',
`create_time` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3),
`update_time` DATETIME(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3),
PRIMARY KEY (`id`),
UNIQUE KEY `uk_yumi_gk_period` (`activity_id`, `period_type`, `period_key`),
KEY `idx_yumi_gk_period_due` (`status`, `snapshot_due_time`, `id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
COMMENT='Daily Game King settlement gate including empty ranking days';