MySQL實(shí)現(xiàn)批量插入測試數(shù)據(jù)的方式小結(jié)
前言
在開發(fā)過程中我們不管是用來測試性能還是在生產(chǎn)環(huán)境中頁面展示好看一點(diǎn), 又或者學(xué)習(xí)驗(yàn)證某一知識點(diǎn)經(jīng)常需要一些測試數(shù)據(jù), 這個(gè)時(shí)候如果手敲的話, 十行二十行還好, 多了就很死亡了, 接下來介紹兩種常用的MySQL測試數(shù)據(jù)批量生成方式
- 存儲方式+函數(shù)
- Navicat的數(shù)據(jù)生成
一、表
準(zhǔn)備了兩張表
角色表:
- id: 自增長
- role_name: 隨機(jī)字符串, 不允許重復(fù)
- orders: 1-1000任意數(shù)字
用戶表:
- id: 自增長
- username: 隨機(jī)字符串, 不允許重復(fù)
- password: 隨機(jī)字符串, 允許重復(fù)
- role_id: 1-10w之間的任意數(shù)字
建表語句:
CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(255) DEFAULT NULL COMMENT '用戶名', `role_id` int(11) DEFAULT NULL COMMENT '角色id', `password` varchar(255) DEFAULT NULL COMMENT '密碼', `salt` varchar(255) DEFAULT NULL COMMENT '鹽', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; CREATE TABLE `role` ( `id` int(11) NOT NULL AUTO_INCREMENT, `role_name` varchar(255) DEFAULT NULL COMMENT '角色名', `orders` int(11) DEFAULT NULL COMMENT '排序權(quán)重\r\n', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
二、使用函數(shù)生成
通過存儲過程快速插入, 通過函數(shù)保證數(shù)據(jù)不重復(fù)
設(shè)置允許創(chuàng)建函數(shù)
查看 MySQL是否允許創(chuàng)建函數(shù)
SHOW VARIABLES LIKE 'log_bin_trust_function_creators';

結(jié)果如圖所示, 我們使用以下命令將創(chuàng)建函數(shù)功能打開(global-所有session都生效)
SET GLOBAL log_bin_trust_function_creators=1;

這個(gè)時(shí)候再一次查詢就會(huì)顯示已打開

產(chǎn)生隨機(jī)字符串
-- 隨機(jī)產(chǎn)生字符串 DELIMITER $$ CREATE FUNCTION rand_string(n INT) RETURNS VARCHAR(255) BEGIN DECLARE chars_str VARCHAR(100) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFJHIJKLMNOPQRSTUVWXYZ'; DECLARE return_str VARCHAR(255) DEFAULT ''; DECLARE i INT DEFAULT 0; WHILE i < n DO SET return_str =CONCAT(return_str,SUBSTRING(chars_str,FLOOR(1+RAND()*52),1)); SET i = i + 1; END WHILE; RETURN return_str; END $$ -- 假如要?jiǎng)h除 -- drop function rand_string;
產(chǎn)生隨機(jī)數(shù)字
-- 用于隨機(jī)產(chǎn)生區(qū)間數(shù)字 DELIMITER $$ CREATE FUNCTION rand_num (from_num INT ,to_num INT) RETURNS INT(11) BEGIN DECLARE i INT DEFAULT 0; SET i = FLOOR(from_num +RAND()*(to_num -from_num+1)); RETURN i; END$$ -- 假如要?jiǎng)h除 -- drop function rand_num;
三、創(chuàng)建存儲過程
插入角色表
-- 插入角色數(shù)據(jù) DELIMITER $$ CREATE PROCEDURE insert_role(max_num INT) BEGIN DECLARE i INT DEFAULT 0; SET autocommit = 0; REPEAT SET i = i + 1; INSERT INTO role ( role_name,orders ) VALUES (rand_string(8),rand_num(1,5000)); UNTIL i = max_num END REPEAT; COMMIT; END$$ -- 刪除 -- DELIMITER ; -- drop PROCEDURE insert_role;
插入用戶表
-- 插入用戶數(shù)據(jù) DELIMITER $$ CREATE PROCEDURE insert_user(START INT, max_num INT) BEGIN DECLARE i INT DEFAULT 0; SET autocommit = 0; REPEAT SET i = i + 1; INSERT INTO user (username, role_id, password, salt ) VALUES (rand_string(8) ,rand_num(1,100000), rand_string(10), rand_string(10)); UNTIL i = max_num END REPEAT; COMMIT; END$$ -- 刪除 -- DELIMITER ; -- drop PROCEDURE insert_user;
四、執(zhí)行存儲過程
-- 執(zhí)行存儲過程,往dept表添加10萬條數(shù)據(jù) CALL insert_role(100000); -- 執(zhí)行存儲過程,往emp表添加100萬條數(shù)據(jù),編號從100000開始 CALL insert_user(100000,1100000);
小結(jié)
執(zhí)行用時(shí) 10w數(shù)據(jù)差不多半分鐘, 100w數(shù)據(jù)超過了20分鐘, 同時(shí) user的存儲還卡死很久…
最后都成功新增, 但是自動(dòng)遞增值和行數(shù)不一致, 這個(gè)我也不知道因?yàn)樯?hellip;

數(shù)據(jù)展示
role表

user表

五、使用 Navicat自帶的數(shù)據(jù)生成
接下來我們使用 Navicat的數(shù)據(jù)生成


直接下一步, 然后選擇對應(yīng)的兩張表生成行數(shù)和對應(yīng)的生成規(guī)則, 基于之前的執(zhí)行速度, 這次 role生成 1w數(shù)據(jù), user生成 10w數(shù)據(jù)
對于字符串類型的字段, 我們可以設(shè)置他的隨機(jī)數(shù)據(jù)生成器, 根據(jù)需要進(jìn)行選擇

例如角色名稱, 選擇了 職位名稱 還可以進(jìn)行是否包含 null 的選擇等

但是如果是 姓名 那么就會(huì)讓你選擇是否唯一

數(shù)字的話會(huì)讓你選擇范圍, 默認(rèn)值等

等確定好了, 我們就可以點(diǎn)擊右下角進(jìn)行生成隨機(jī)測試數(shù)據(jù)

通過結(jié)果可以看到生成十一萬測試數(shù)據(jù)一共用時(shí)十一秒, 比第一種方法速度快很多, 推薦使用
以上就是MySQL實(shí)現(xiàn)批量插入測試數(shù)據(jù)的方式小結(jié)的詳細(xì)內(nèi)容,更多關(guān)于MySQL批量插入數(shù)據(jù)的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
MySQL MHA集群詳解(數(shù)據(jù)庫高可用)
MHA(MasterHighAvailability)是開源MySQL高可用管理工具,用于自動(dòng)故障檢測與轉(zhuǎn)移,支持異步或半同步復(fù)制的MySQL主從架構(gòu),本文介紹MySQL MHA集群(數(shù)據(jù)庫高可用)的相關(guān)知識,感興趣的朋友跟隨小編一起看看吧2025-11-11
Mysql實(shí)戰(zhàn)練習(xí)之簡單圖書管理系統(tǒng)
由于課設(shè)需要做這個(gè),于是就抽了點(diǎn)閑余時(shí)間,寫了下,用Mysql與Java,基本全部都涉及到,包括借書/還書,以及書籍信息的更新,查看所有的書籍。需要的朋友可以參考下2021-09-09
專業(yè)級的MySQL開發(fā)設(shè)計(jì)規(guī)范及SQL編寫規(guī)范
這篇文章主要介紹了專業(yè)級的MySQL開發(fā)設(shè)計(jì)規(guī)范及SQL編寫規(guī)范,需要的朋友可以參考下2020-11-11
mysql啟動(dòng)報(bào)錯(cuò):The?server?quit?without?updating?PID?file的幾種
不管是在安裝還是運(yùn)行MySQL的時(shí)候,都很有可能遇到報(bào)錯(cuò),下面這篇文章主要給大家介紹了關(guān)于mysql啟動(dòng)報(bào)錯(cuò):The?server?quit?without?updating?PID?file的幾種解決辦法,需要的朋友可以參考下2022-08-08
Mysql中常用函數(shù)之分組,連接查詢功能實(shí)現(xiàn)
在MySQL中,函數(shù)可以進(jìn)行各種數(shù)據(jù)操作,如字符處理、數(shù)學(xué)計(jì)算和日期格式化等,單行函數(shù)處理單條數(shù)據(jù)記錄,而分組函數(shù)則處理多條數(shù)據(jù)記錄,本文給大家介紹Mysql中常用函數(shù)之分組,連接查詢功能實(shí)現(xiàn),感興趣的朋友一起看看吧2024-10-10

