62 lines
2.5 KiB
SQL
62 lines
2.5 KiB
SQL
-- Yumi Game King: direct multi-resource rewards and stop/resume settlement safety.
|
|
--
|
|
-- Performance review:
|
|
-- 1. Both ALTERs target bounded configuration/delivery tables; no game-event ledger,
|
|
-- wallet ledger or ranking aggregate is scanned.
|
|
-- 2. reward_items_json is nullable during the online DDL. The two bounded UPDATE JOINs use
|
|
-- owner_type/owner_id and prize/rank primary keys to freeze existing pending orders
|
|
-- before operators can change their activity configuration.
|
|
-- 3. ever_enabled is backfilled from the indexed enabled flag plus three activity-scoped
|
|
-- existence probes. Each probe uses an activity_id primary/index prefix and stops at
|
|
-- the first row, avoiding full scans of event or draw history.
|
|
-- 4. Run during low traffic with adequate temporary disk. LOCK=NONE keeps ordinary reads
|
|
-- and writes available, but MySQL metadata locks can still wait behind long transactions.
|
|
|
|
ALTER TABLE `yumi_game_king_activity`
|
|
ADD COLUMN `ever_enabled` TINYINT(1) NOT NULL DEFAULT 0 AFTER `enabled`,
|
|
ALGORITHM=INPLACE, LOCK=NONE;
|
|
|
|
UPDATE `yumi_game_king_activity` AS activity
|
|
SET activity.`ever_enabled` = 1
|
|
WHERE activity.`enabled` = 1
|
|
OR EXISTS (
|
|
SELECT 1
|
|
FROM `yumi_game_king_user` AS aggregate
|
|
WHERE aggregate.`activity_id` = activity.`id`
|
|
LIMIT 1
|
|
)
|
|
OR EXISTS (
|
|
SELECT 1
|
|
FROM `yumi_game_king_draw_record` AS draw_record
|
|
WHERE draw_record.`activity_id` = activity.`id`
|
|
LIMIT 1
|
|
)
|
|
OR EXISTS (
|
|
SELECT 1
|
|
FROM `yumi_game_king_period_settlement` AS period_gate
|
|
WHERE period_gate.`activity_id` = activity.`id`
|
|
LIMIT 1
|
|
);
|
|
|
|
ALTER TABLE `yumi_game_king_delivery_item`
|
|
ADD COLUMN `reward_items_json` TEXT NULL AFTER `resource_group_id`,
|
|
ALGORITHM=INPLACE, LOCK=NONE;
|
|
|
|
UPDATE `yumi_game_king_delivery_item` AS delivery
|
|
JOIN `yumi_game_king_draw_record` AS draw_record
|
|
ON delivery.`owner_type` = 'DRAW'
|
|
AND delivery.`owner_id` = draw_record.`id`
|
|
JOIN `yumi_game_king_prize` AS prize
|
|
ON prize.`id` = draw_record.`prize_id`
|
|
SET delivery.`reward_items_json` = prize.`reward_items_json`
|
|
WHERE delivery.`reward_items_json` IS NULL;
|
|
|
|
UPDATE `yumi_game_king_delivery_item` AS delivery
|
|
JOIN `yumi_game_king_settlement_record` AS settlement
|
|
ON delivery.`owner_type` = 'SETTLEMENT'
|
|
AND delivery.`owner_id` = settlement.`id`
|
|
JOIN `yumi_game_king_rank_reward` AS rank_reward
|
|
ON rank_reward.`id` = settlement.`rank_reward_id`
|
|
SET delivery.`reward_items_json` = rank_reward.`reward_items_json`
|
|
WHERE delivery.`reward_items_json` IS NULL;
|