From 830cfcf33d25dedc732bf95eb61d4d440e67d88c Mon Sep 17 00:00:00 2001 From: yml Date: Mon, 8 Jun 2026 20:12:18 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=88=E5=B9=B6=E5=95=86=E5=93=81=E7=BC=96?= =?UTF-8?q?=E5=8F=B7=E8=BF=81=E7=A7=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/migrations/000001_init.sql | 10 ++++ backend/migrations/000002_add_listing_no.sql | 33 ----------- scripts/load_test_data.sql | 12 +++- scripts/load_test_data_optimized.sql | 62 +++++++++++++++----- 4 files changed, 69 insertions(+), 48 deletions(-) delete mode 100644 backend/migrations/000002_add_listing_no.sql diff --git a/backend/migrations/000001_init.sql b/backend/migrations/000001_init.sql index d692f9a..b8dfa92 100644 --- a/backend/migrations/000001_init.sql +++ b/backend/migrations/000001_init.sql @@ -75,6 +75,7 @@ CREATE TABLE IF NOT EXISTS game_accounts ( -- 租号商品列表:用户发布的出租商品 CREATE TABLE IF NOT EXISTS rental_listings ( id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT, + listing_no VARCHAR(20) NOT NULL COMMENT '商品编号,格式yyyyMMddNNNN', account_id BIGINT UNSIGNED NOT NULL COMMENT '关联的游戏账号ID', owner_id BIGINT UNSIGNED NOT NULL COMMENT '号主ID', price DECIMAL(12,2) NOT NULL DEFAULT 0.00 COMMENT '租金(元/小时)', @@ -86,12 +87,21 @@ CREATE TABLE IF NOT EXISTS rental_listings ( published_at DATETIME NULL COMMENT '发布时间', created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + UNIQUE KEY uk_rental_listings_listing_no (listing_no), KEY idx_rental_listings_account_id (account_id), KEY idx_rental_listings_owner_id (owner_id), KEY idx_rental_listings_filter (status, review_status, in_transaction, price), KEY idx_rental_listings_published (status, review_status, published_at DESC) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='租号商品列表'; +-- 商品编号日序列表:记录每天已分配的最大序号 +CREATE TABLE IF NOT EXISTS listing_no_sequences ( + biz_date CHAR(8) PRIMARY KEY COMMENT '业务日期yyyyMMdd', + next_seq INT NOT NULL DEFAULT 0 COMMENT '当日已分配最大序号', + created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='商品编号日序列表'; + -- ------------------------------------------- -- 订单相关表 -- ------------------------------------------- diff --git a/backend/migrations/000002_add_listing_no.sql b/backend/migrations/000002_add_listing_no.sql deleted file mode 100644 index cc982a9..0000000 --- a/backend/migrations/000002_add_listing_no.sql +++ /dev/null @@ -1,33 +0,0 @@ --- 商品编号:用于前台展示、搜索和客服定位 -ALTER TABLE rental_listings - ADD COLUMN listing_no VARCHAR(20) NULL COMMENT '商品编号,格式yyyyMMddNNNN' AFTER id; - -UPDATE rental_listings AS l -JOIN ( - SELECT - id, - CONCAT( - DATE_FORMAT(created_at, '%Y%m%d'), - LPAD(ROW_NUMBER() OVER (PARTITION BY DATE(created_at) ORDER BY id), 4, '0') - ) AS generated_listing_no - FROM rental_listings -) AS seq ON seq.id = l.id -SET l.listing_no = seq.generated_listing_no -WHERE l.listing_no IS NULL OR l.listing_no = ''; - -ALTER TABLE rental_listings - MODIFY COLUMN listing_no VARCHAR(20) NOT NULL COMMENT '商品编号,格式yyyyMMddNNNN', - ADD UNIQUE KEY uk_rental_listings_listing_no (listing_no); - -CREATE TABLE IF NOT EXISTS listing_no_sequences ( - biz_date CHAR(8) PRIMARY KEY COMMENT '业务日期yyyyMMdd', - next_seq INT NOT NULL DEFAULT 0 COMMENT '当日已分配最大序号', - created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - updated_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='商品编号日序列表'; - -INSERT INTO listing_no_sequences (biz_date, next_seq) -SELECT DATE_FORMAT(created_at, '%Y%m%d') AS biz_date, COUNT(*) AS next_seq -FROM rental_listings -GROUP BY DATE_FORMAT(created_at, '%Y%m%d') -ON DUPLICATE KEY UPDATE next_seq = GREATEST(next_seq, VALUES(next_seq)); diff --git a/scripts/load_test_data.sql b/scripts/load_test_data.sql index 0c9a5ab..a14c038 100644 --- a/scripts/load_test_data.sql +++ b/scripts/load_test_data.sql @@ -150,9 +150,13 @@ BEGIN SET deposit_val = 100.00 + (i % 10) * 50.00; INSERT INTO rental_listings ( - account_id, owner_id, price, deposit_amount, + listing_no, account_id, owner_id, price, deposit_amount, in_transaction, status, review_status, published_at ) VALUES ( + CONCAT( + DATE_FORMAT(DATE_SUB(NOW(), INTERVAL (i % 90) DAY), '%Y%m%d'), + LPAD(FLOOR((i - 1) / 90) + 1, 4, '0') + ), account_id_val, user_id_val, price_val, @@ -178,6 +182,12 @@ BEGIN END IF; END WHILE; + INSERT INTO listing_no_sequences (biz_date, next_seq) + SELECT LEFT(listing_no, 8), MAX(CAST(SUBSTRING(listing_no, 9) AS UNSIGNED)) + FROM rental_listings + GROUP BY LEFT(listing_no, 8) + ON DUPLICATE KEY UPDATE next_seq = GREATEST(next_seq, VALUES(next_seq)); + COMMIT; END$$ DELIMITER ; diff --git a/scripts/load_test_data_optimized.sql b/scripts/load_test_data_optimized.sql index d0f4270..1c1ee3b 100644 --- a/scripts/load_test_data_optimized.sql +++ b/scripts/load_test_data_optimized.sql @@ -18,12 +18,14 @@ BEGIN DECLARE current_batch INT DEFAULT 0; DECLARE batch_start INT; DECLARE batch_end INT; + DECLARE current_limit INT; SET batches = CEIL(batch_size / batch_limit); WHILE current_batch < batches DO SET batch_start = current_batch * batch_limit + 1; SET batch_end = LEAST((current_batch + 1) * batch_limit, batch_size); + SET current_limit = batch_end - batch_start + 1; -- 使用 INSERT ... SELECT 批量生成 INSERT INTO users (phone, nickname, realname_status, risk_status, credit_score, status, created_at) @@ -45,7 +47,7 @@ BEGIN (SELECT 0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) t3, (SELECT @row := batch_start - 1) r - LIMIT batch_end - batch_start + 1 + LIMIT current_limit ) seqs ON DUPLICATE KEY UPDATE id=id; @@ -90,6 +92,7 @@ BEGIN DECLARE batch_limit INT DEFAULT 1000; DECLARE batches INT; DECLARE current_batch INT DEFAULT 0; + DECLARE verified_user_count INT DEFAULT 0; -- 创建临时表存储已实名用户ID DROP TEMPORARY TABLE IF EXISTS tmp_verified_users; @@ -104,6 +107,8 @@ BEGIN WHERE realname_status = 'verified' ORDER BY id; + SELECT COUNT(*) INTO verified_user_count FROM tmp_verified_users; + SET batches = CEIL(batch_size / batch_limit); WHILE current_batch < batches DO @@ -149,15 +154,19 @@ BEGIN (SELECT @row2 := current_batch * batch_limit) r LIMIT batch_limit ) seqs - INNER JOIN tmp_verified_users u ON u.row_num = (seq % (SELECT COUNT(*) FROM tmp_verified_users)) + 1 + INNER JOIN tmp_verified_users u ON u.row_num = (seq % verified_user_count) + 1 WHERE seq <= batch_size; -- 批量生成租号商品 INSERT INTO rental_listings ( - account_id, owner_id, price, deposit_amount, + listing_no, account_id, owner_id, price, deposit_amount, in_transaction, status, review_status, published_at ) SELECT + CONCAT( + DATE_FORMAT(DATE_SUB(NOW(), INTERVAL (ga.id % 90) DAY), '%Y%m%d'), + LPAD(FLOOR((ga.id - 1) / 90) + 1, 4, '0') + ) as listing_no, ga.id as account_id, ga.owner_id, 5.00 + ((ga.id % 20) * 0.5) as price, @@ -182,6 +191,14 @@ BEGIN COMMIT; END WHILE; + INSERT INTO listing_no_sequences (biz_date, next_seq) + SELECT LEFT(listing_no, 8), MAX(CAST(SUBSTRING(listing_no, 9) AS UNSIGNED)) + FROM rental_listings + GROUP BY LEFT(listing_no, 8) + ON DUPLICATE KEY UPDATE next_seq = GREATEST(next_seq, VALUES(next_seq)); + + COMMIT; + DROP TEMPORARY TABLE IF EXISTS tmp_verified_users; END$$ DELIMITER ; @@ -196,6 +213,8 @@ BEGIN DECLARE batch_limit INT DEFAULT 1000; DECLARE batches INT; DECLARE current_batch INT DEFAULT 0; + DECLARE available_listing_count INT DEFAULT 0; + DECLARE verified_user_count INT DEFAULT 0; -- 创建临时表:可用商品 DROP TEMPORARY TABLE IF EXISTS tmp_available_listings; @@ -214,6 +233,8 @@ BEGIN WHERE status IN ('published', 'active') AND review_status = 'approved' ORDER BY id; + SELECT COUNT(*) INTO available_listing_count FROM tmp_available_listings; + -- 创建临时表:已实名用户 DROP TEMPORARY TABLE IF EXISTS tmp_verified_users; CREATE TEMPORARY TABLE tmp_verified_users ( @@ -227,6 +248,8 @@ BEGIN WHERE realname_status = 'verified' ORDER BY id; + SELECT COUNT(*) INTO verified_user_count FROM tmp_verified_users; + SET batches = CEIL(batch_size / batch_limit); WHILE current_batch < batches DO @@ -278,8 +301,8 @@ BEGIN (SELECT @row3 := current_batch * batch_limit) r LIMIT batch_limit ) seqs - INNER JOIN tmp_available_listings l ON l.row_num = (seq % (SELECT COUNT(*) FROM tmp_available_listings)) + 1 - INNER JOIN tmp_verified_users r ON r.row_num = (seq % (SELECT COUNT(*) FROM tmp_verified_users)) + 1 + INNER JOIN tmp_available_listings l ON l.row_num = (seq % available_listing_count) + 1 + INNER JOIN tmp_verified_users r ON r.row_num = (seq % verified_user_count) + 1 WHERE seq <= batch_size AND r.id != l.owner_id LIMIT batch_limit; @@ -302,6 +325,8 @@ BEGIN DECLARE batch_limit INT DEFAULT 1000; DECLARE batches INT; DECLARE current_batch INT DEFAULT 0; + DECLARE user_count INT DEFAULT 0; + DECLARE order_count INT DEFAULT 0; -- 创建临时表:用户列表 DROP TEMPORARY TABLE IF EXISTS tmp_users; @@ -315,6 +340,8 @@ BEGIN FROM users, (SELECT @rn := 0) init ORDER BY id; + SELECT COUNT(*) INTO user_count FROM tmp_users; + -- 创建临时表:订单列表 DROP TEMPORARY TABLE IF EXISTS tmp_orders; CREATE TEMPORARY TABLE tmp_orders ( @@ -327,6 +354,8 @@ BEGIN FROM rental_orders, (SELECT @rn2 := 0) init ORDER BY id; + SELECT COUNT(*) INTO order_count FROM tmp_orders; + SET batches = CEIL(batch_size / batch_limit); WHILE current_batch < batches DO @@ -365,8 +394,8 @@ BEGIN (SELECT @row4 := current_batch * batch_limit) r LIMIT batch_limit ) seqs - INNER JOIN tmp_users u ON u.row_num = (seq % (SELECT COUNT(*) FROM tmp_users)) + 1 - LEFT JOIN tmp_orders o ON o.row_num = (seq % (SELECT COUNT(*) FROM tmp_orders)) + 1 + INNER JOIN tmp_users u ON u.row_num = (seq % user_count) + 1 + LEFT JOIN tmp_orders o ON o.row_num = (seq % order_count) + 1 WHERE seq <= batch_size LIMIT batch_limit; @@ -386,6 +415,12 @@ DROP PROCEDURE IF EXISTS generate_chat_data_batch; DELIMITER $$ CREATE PROCEDURE generate_chat_data_batch(IN message_count INT) BEGIN + DECLARE batch_limit INT DEFAULT 1000; + DECLARE batches INT; + DECLARE current_batch INT DEFAULT 0; + DECLARE conversation_count INT DEFAULT 0; + DECLARE user_count INT DEFAULT 0; + -- 先生成聊天会话(基于订单) INSERT INTO chat_conversations (order_id, type, title, status, last_message_at) SELECT @@ -399,11 +434,6 @@ BEGIN LIMIT 1000 ON DUPLICATE KEY UPDATE order_id=order_id; - -- 批量生成聊天消息 - DECLARE batch_limit INT DEFAULT 1000; - DECLARE batches INT; - DECLARE current_batch INT DEFAULT 0; - DROP TEMPORARY TABLE IF EXISTS tmp_conversations; CREATE TEMPORARY TABLE tmp_conversations ( id BIGINT PRIMARY KEY, @@ -415,6 +445,8 @@ BEGIN FROM chat_conversations, (SELECT @rn := 0) init ORDER BY id; + SELECT COUNT(*) INTO conversation_count FROM tmp_conversations; + DROP TEMPORARY TABLE IF EXISTS tmp_users; CREATE TEMPORARY TABLE tmp_users ( id BIGINT PRIMARY KEY, @@ -426,6 +458,8 @@ BEGIN FROM users, (SELECT @rn2 := 0) init ORDER BY id; + SELECT COUNT(*) INTO user_count FROM tmp_users; + SET batches = CEIL(message_count / batch_limit); WHILE current_batch < batches DO @@ -453,8 +487,8 @@ BEGIN (SELECT @row5 := current_batch * batch_limit) r LIMIT batch_limit ) seqs - INNER JOIN tmp_conversations c ON c.row_num = (seq % (SELECT COUNT(*) FROM tmp_conversations)) + 1 - INNER JOIN tmp_users u ON u.row_num = (seq % (SELECT COUNT(*) FROM tmp_users)) + 1 + INNER JOIN tmp_conversations c ON c.row_num = (seq % conversation_count) + 1 + INNER JOIN tmp_users u ON u.row_num = (seq % user_count) + 1 WHERE seq <= message_count LIMIT batch_limit;