如何在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
相关产品推荐
相关产品推荐

