MySQL實(shí)現(xiàn)批量插入測試數(shù)據(jù)的方式小結(jié)
前言
在開發(fā)過程中我們不管是用來測試性能還是在生產(chǎn)環(huán)境中頁面展示好看一點(diǎn), 又或者學(xué)習(xí)驗(yàn)證某一知識(shí)點(diǎn)經(jīng)常需要一些測試數(shù)據(jù), 這個(gè)時(shí)候如果手敲的話, 十行二十行還好, 多了就很死亡了, 接下來介紹兩種常用的MySQL測試數(shù)據(jù)批量生成方式
- 存儲(chǔ)方式+函數(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ù)生成
通過存儲(chǔ)過程快速插入, 通過函數(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)建存儲(chǔ)過程
插入角色表
-- 插入角色數(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í)行存儲(chǔ)過程
-- 執(zhí)行存儲(chǔ)過程,往dept表添加10萬條數(shù)據(jù) CALL insert_role(100000); -- 執(zhí)行存儲(chǔ)過程,往emp表添加100萬條數(shù)據(jù),編號(hào)從100000開始 CALL insert_user(100000,1100000);
小結(jié)
執(zhí)行用時(shí) 10w數(shù)據(jù)差不多半分鐘, 100w數(shù)據(jù)超過了20分鐘, 同時(shí) user的存儲(chǔ)還卡死很久…
最后都成功新增, 但是自動(dòng)遞增值和行數(shù)不一致, 這個(gè)我也不知道因?yàn)樯?hellip;
數(shù)據(jù)展示
role表
user表
五、使用 Navicat自帶的數(shù)據(jù)生成
接下來我們使用 Navicat的數(shù)據(jù)生成
直接下一步, 然后選擇對(duì)應(yīng)的兩張表生成行數(shù)和對(duì)應(yīng)的生成規(guī)則, 基于之前的執(zhí)行速度, 這次 role生成 1w數(shù)據(jù), user生成 10w數(shù)據(jù)
對(duì)于字符串類型的字段, 我們可以設(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獲取當(dāng)前時(shí)間并轉(zhuǎn)換成字符串的實(shí)現(xiàn)
本文主要介紹了MySql獲取當(dāng)前時(shí)間并轉(zhuǎn)換成字符串的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07MySQL權(quán)限USAGE和ALL PRIVILEGES的用法
本文主要介紹了MySQL權(quán)限USAGE和ALL PRIVILEGES的用法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-09-09Mysql服務(wù)器的安裝配置與啟動(dòng)關(guān)閉方法詳解
MySQL 是最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng),在 WEB 應(yīng)用方面 MySQL 是最好的 RDBMS(Relational Database Management System:關(guān)系數(shù)據(jù)庫管理系統(tǒng))應(yīng)用軟件之一2021-10-10mysql 數(shù)據(jù)插入優(yōu)化方法之concurrent_insert
在MyISAM里讀寫操作是串行的,但當(dāng)對(duì)同一個(gè)表進(jìn)行查詢和插入操作時(shí),為了降低鎖競爭的頻率,根據(jù)concurrent_insert的設(shè)置,MyISAM是可以并行處理查詢和插入的2021-07-07關(guān)于mysql調(diào)用新手們常犯的11個(gè)錯(cuò)誤總結(jié)
對(duì)于很多新手們來說,使用PHP可以在短短幾個(gè)小時(shí)之內(nèi)輕松地寫出具有特定功能的代碼。但是,構(gòu)建一個(gè)穩(wěn)定可靠的數(shù)據(jù)庫卻需要花上一些時(shí)日和相關(guān)技能。下面這篇文章就來總結(jié)了關(guān)于mysql調(diào)用新手們常犯的十一個(gè)錯(cuò)誤,需要的朋友可以參考學(xué)習(xí)。2017-03-03一文搞懂mysql如何處理json格式的字段(解析json數(shù)據(jù))
這篇文章主要給大家介紹了關(guān)于mysql如何處理json格式的字段的相關(guān)資料,MySQL中的JSON類型是一種數(shù)據(jù)類型,用于存儲(chǔ)和處理JSON(JavaScript Object Notation)格式的數(shù)據(jù),需要的朋友可以參考下2023-12-12