如何准备百万性能测试数据

需要在数据库准备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

image

当创建MySQL存储过程时,返回-1的问题通常与存储过程中的错误处理有关。有以下几种可能的原因和解决方法:

  1. 存储过程是否存在语法错误:请确保存储过程中的语法和逻辑都正确,不要存在语法错误或逻辑错误。

  2. 存储过程是否正确处理异常:在存储过程中,如果发生了异常,未正确处理异常可能导致返回-1。因此,请确保在存储过程中使用适当的异常处理机制(如DECLARE CONTINUE HANDLER FOR SQLSTATE)来捕获和处理异常,并确保在处理异常时不会返回-1。

  3. 存储过程中的逻辑错误:如果存储过程中的逻辑错误导致返回-1,需要仔细检查存储过程的逻辑,确保它按预期执行。

  4. 存储过程中的权限问题:可能存储过程所使用的用户没有执行该存储过程的权限,导致无法正确执行存储过程。请确保存储过程执行的用户有足够的权限。

创建存储过程成功应该是0,如下:
image

经测试,是权限不够。
更换更高权限的用户,可以执行成功。

image

跨库使用存储过程问题,使用use无法解决
image

执行存储过程,选择对应的库
image

posted @ 2023-09-06 14:33  捷后愚生  阅读(96)  评论(0编辑  收藏  举报