如何准备百万性能测试数据
需要在数据库准备100万条数据,进行性能测试。
使用存储过程在MySQL准备测试数据。
Q:
你作为一名数据库专家,有两张表,结构如下:
CREATE TABLE user_base
(
id
bigint(20) NOT NULL,
apply_no
varchar(50) DEFAULT NULL COMMENT '关联的申请号',
batch_date
date DEFAULT NULL COMMENT '批次日期',
car_no
varchar(100) DEFAULT NULL COMMENT '车牌号',
created_date
datetime(6) DEFAULT NULL,
due_bill_no
varchar(50) DEFAULT NULL COMMENT '关联的借款单号',
hash_key
varchar(64) DEFAULT NULL COMMENT '基于IdNo生成',
id_no
varchar(100) NOT NULL COMMENT '证件号码',
id_type
varchar(20) NOT NULL COMMENT '证件类型 IdTypeEnum',
last_modified_date
datetime(6) DEFAULT NULL,
phone
varchar(100) DEFAULT NULL COMMENT '手机号',
project_no
varchar(20) DEFAULT NULL COMMENT '项目编号',
remark
varchar(255) DEFAULT NULL,
sex
varchar(10) DEFAULT NULL COMMENT '性别(MALE/FEMALE)',
user_id
varchar(50) NOT NULL COMMENT '用户编号',
user_name
varchar(200) NOT NULL COMMENT '用户姓名',
version
int(11) DEFAULT NULL,
PRIMARY KEY (id
),
KEY idx_user_base_project_no_due_bill_no_id_no
(project_no
,due_bill_no
,id_no
),
KEY idx_user_base_batch_date
(batch_date
),
KEY idx_user_base_id_no
(id_no
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户基本信息表';
CREATE TABLE user_bank_card
(
id
bigint(20) NOT NULL,
user_id
varchar(50) NOT NULL COMMENT '用户编号',
id_no
varchar(100) NOT NULL COMMENT '身份证号',
bank_name
varchar(50) NOT NULL COMMENT '银行名称',
bank_code
varchar(20) NOT NULL COMMENT '银行编码',
bank_card_no
varchar(100) DEFAULT NULL,
phone
varchar(100) DEFAULT NULL,
version
int(11) DEFAULT NULL,
created_date
datetime(6) DEFAULT NULL,
last_modified_date
datetime(6) DEFAULT NULL,
project_no
varchar(20) DEFAULT NULL COMMENT '项目编号',
due_bill_no
varchar(50) DEFAULT NULL COMMENT '借据号',
agreement_no
varchar(100) DEFAULT NULL COMMENT '协议号',
apply_no
varchar(100) DEFAULT NULL COMMENT '申请号',
account_name
varchar(100) DEFAULT NULL COMMENT '账户名',
is_default
tinyint(1) DEFAULT '1' COMMENT '是否使用',
src_req_sn
varchar(50) DEFAULT NULL COMMENT '原始绑卡请求号',
PRIMARY KEY (id
),
KEY idx_user_bank_card_project_due_bill_no
(project_no
,due_bill_no
)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='用户银行绑卡信息';
我现在想构造1000条数据,要求id从1开始递增,apply_no、due_bill_no唯一,且同一条数据的apply_no、due_bill_no相同,两个表之间通过apply_no关联,project_no固定为WS10043190001,sex为MALE或FEMALE,其他字段随机生成。
请你帮我写一个mysql存储过程完成上述需求。
A:
当然,我可以帮您编写一个 MySQL 存储过程来满足您的需求。以下是一个示例存储过程的实现:
mysql
DELIMITER //
CREATE PROCEDURE generate_data()
BEGIN
DECLARE i INT DEFAULT 1;
DECLARE total_rows INT DEFAULT 1000;
DECLARE project_no VARCHAR(20) DEFAULT 'WS10043190001';
DECLARE sex ENUM('MALE', 'FEMALE');
WHILE i <= total_rows DO
-- Generate random values
SET @apply_no := CONCAT('apply', i);
SET @due_bill_no := CONCAT('duebill', i);
SET @id_no := CONCAT('idno', i);
SET @user_id := CONCAT('user', i);
SET @user_name := CONCAT('user', i, ' name');
SET @phone := CONCAT('123456789', i);
SET @bank_card_no := CONCAT('123456789', i);
SET @account_name := CONCAT('account', i, ' name');
SET @bank_code := CONCAT('bank', i);
-- Insert into user_base table
INSERT INTO user_base (id, apply_no, batch_date, car_no, created_date, due_bill_no, hash_key, id_no, id_type, last_modified_date, phone, project_no, remark, sex, user_id, user_name, version)
VALUES (i, @apply_no, CURDATE(), NULL, NOW(6), @due_bill_no, MD5(@id_no), @id_no, 'ID_CARD', NOW(6), @phone, project_no, NULL, sex, @user_id, @user_name, NULL);
-- Insert into user_bank_card table
INSERT INTO user_bank_card (id, user_id, id_no, bank_name, bank_code, bank_card_no, phone, version, created_date, last_modified_date, project_no, due_bill_no, agreement_no, apply_no, account_name, is_default, src_req_sn)
VALUES (i, @user_id, @id_no, 'Bank Name', @bank_code, @bank_card_no, @phone, NULL, NOW(6), NOW(6), project_no, @due_bill_no, NULL, @apply_no, @account_name, 1, NULL);
SET i = i + 1;
END WHILE;
END //
DELIMITER ;
请注意,上述存储过程中的字段值是随机生成的示例值,您可以根据实际需求进行修改。您可以在 MySQL 中运行此存储过程,通过调用 CALL generate_data();
来生成所需的 1000 条数据。
希望这可以帮到您!如果您有任何其他问题,请随时提问。
修改
DELIMITER //
CREATE PROCEDURE generate_data()
BEGIN
DECLARE i INT DEFAULT 1;
DECLARE total_rows INT DEFAULT 1000;
DECLARE project_no VARCHAR(20) DEFAULT 'WS10043190001';
DECLARE sex ENUM('MALE', 'FEMALE');
WHILE i <= total_rows DO
-- Generate random values
SET @apply_no := CONCAT('apply', i);
-- 需要apply_no、due_bill_no的值相同,修改脚本
SET @due_bill_no := CONCAT('apply', i);
SET @id_no := CONCAT('idno', i);
SET @user_id := CONCAT('user', i);
SET @user_name := CONCAT('user', i, ' name');
SET @phone := CONCAT('123456789', i);
SET @bank_card_no := CONCAT('123456789', i);
SET @account_name := CONCAT('account', i, ' name');
SET @bank_code := CONCAT('bank', i);
-- Insert into user_base table
INSERT INTO user_base (id, apply_no, batch_date, car_no, created_date, due_bill_no, hash_key, id_no, id_type, last_modified_date, phone, project_no, remark, sex, user_id, user_name, version)
VALUES (i, @apply_no, CURDATE(), NULL, NOW(6), @due_bill_no, MD5(@id_no), @id_no, 'ID_CARD', NOW(6), @phone, project_no, NULL, sex, @user_id, @user_name, NULL);
-- Insert into user_bank_card table
INSERT INTO user_bank_card (id, user_id, id_no, bank_name, bank_code, bank_card_no, phone, version, created_date, last_modified_date, project_no, due_bill_no, agreement_no, apply_no, account_name, is_default, src_req_sn)
VALUES (i, @user_id, @id_no, 'Bank Name', @bank_code, @bank_card_no, @phone, NULL, NOW(6), NOW(6), project_no, @due_bill_no, NULL, @apply_no, @account_name, 1, NULL);
SET i = i + 1;
END WHILE;
END //
DELIMITER ;
创建MySQL存储过程时,返回-1
当创建MySQL存储过程时,返回-1的问题通常与存储过程中的错误处理有关。有以下几种可能的原因和解决方法:
-
存储过程是否存在语法错误:请确保存储过程中的语法和逻辑都正确,不要存在语法错误或逻辑错误。
-
存储过程是否正确处理异常:在存储过程中,如果发生了异常,未正确处理异常可能导致返回-1。因此,请确保在存储过程中使用适当的异常处理机制(如
DECLARE CONTINUE HANDLER FOR SQLSTATE
)来捕获和处理异常,并确保在处理异常时不会返回-1。 -
存储过程中的逻辑错误:如果存储过程中的逻辑错误导致返回-1,需要仔细检查存储过程的逻辑,确保它按预期执行。
-
存储过程中的权限问题:可能存储过程所使用的用户没有执行该存储过程的权限,导致无法正确执行存储过程。请确保存储过程执行的用户有足够的权限。
创建存储过程成功应该是0,如下:
经测试,是权限不够。
更换更高权限的用户,可以执行成功。
跨库使用存储过程问题,使用use无法解决
执行存储过程,选择对应的库