You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MySQL 8中生成固定行数以开展性能测试?

在MySQL 8中生成10万行测试数据的方法

嗨,刚好我对这个场景很熟悉,给你分享两种实用的方法,完美适配你要生成随机字符串插入表的需求:

方法一:递归CTE + 自定义随机字符串函数(最接近PostgreSQL的写法)

首先,我们先创建一个和你PostgreSQL里random_string(int)功能一致的自定义函数,用来生成指定长度的随机字符串:

DELIMITER //
CREATE FUNCTION random_string(length INT)
RETURNS VARCHAR(255)
DETERMINISTIC
BEGIN
    -- 定义可用的字符集,你可以按需调整大小写、特殊字符等
    DECLARE chars_str VARCHAR(100) DEFAULT 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
    DECLARE return_str VARCHAR(255) DEFAULT '';
    DECLARE i INT DEFAULT 0;
    
    WHILE i < length DO
        -- 随机选取字符拼接成目标字符串
        SET return_str = CONCAT(return_str, SUBSTRING(chars_str, FLOOR(1 + RAND() * LENGTH(chars_str)), 1));
        SET i = i + 1;
    END WHILE;
    
    RETURN return_str;
END //
DELIMITER ;

接下来,利用MySQL 8支持的递归CTE来生成1到100000的序列,效果和PostgreSQL的generate_series几乎一样,然后批量插入数据:

-- 先调整递归深度(MySQL默认递归深度是1000,生成10万行需要临时调大)
SET SESSION max_recursion_depth = 100000;

WITH RECURSIVE nums AS (
    SELECT 1 AS n
    UNION ALL
    SELECT n + 1 FROM nums WHERE n < 100000
)
INSERT INTO film(title)
SELECT random_string(30) FROM nums;

方法二:存储过程循环插入(适合更灵活的场景)

如果你需要更灵活的控制(比如分批插入、给多个字段生成不同规则的随机数据),可以用存储过程来实现:

DELIMITER //
CREATE PROCEDURE insert_test_data(IN row_count INT)
BEGIN
    DECLARE i INT DEFAULT 0;
    WHILE i < row_count DO
        INSERT INTO film(title) VALUES (random_string(30));
        SET i = i + 1;
    END WHILE;
END //
DELIMITER ;

-- 调用存储过程插入10万行
CALL insert_test_data(100000);

不过要注意,循环插入的效率会比CTE批量插入低一些,数据量越大差异越明显,所以优先推荐方法一哦。

内容的提问来源于stack exchange,提问作者Jelly Orns

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:15:06