MySQL實現(xiàn)批量插入測試數(shù)據(jù)的方式總結(jié)
前言
在開發(fā)過程中我們不管是用來測試性能還是在生產(chǎn)環(huán)境中頁面展示好看一點, 又或者學(xué)習(xí)驗證某一知識點經(jīng)常需要一些測試數(shù)據(jù), 這個時候如果手敲的話, 十行二十行還好, 多了就很死亡了, 接下來介紹兩種常用的MySQL測試數(shù)據(jù)批量生成方式
- 存儲方式+函數(shù)
- Navicat的數(shù)據(jù)生成
表
準(zhǔn)備了兩張表 角色表:
- id: 自增長
- role_name: 隨機字符串, 不允許重復(fù)
- orders: 1-1000任意數(shù)字
用戶表:
- id: 自增長
- username: 隨機字符串, 不允許重復(fù)
- password: 隨機字符串, 允許重復(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;
這個時候再一次查詢就會顯示已打開
產(chǎn)生隨機字符串
-- 隨機產(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 $$ -- 假如要刪除 -- drop function rand_string;
產(chǎn)生隨機數(shù)字
-- 用于隨機產(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$$ -- 假如要刪除 -- 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í)行用時 10w數(shù)據(jù)差不多半分鐘, 100w數(shù)據(jù)超過了20分鐘, 同時 user的存儲還卡死很久...
最后都成功新增, 但是自動遞增值和行數(shù)不一致, 這個我也不知道因為啥...
數(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è)置他的隨機數(shù)據(jù)生成器, 根據(jù)需要進行選擇
例如角色名稱, 選擇了 職位名稱
還可以進行是否包含 null 的選擇等
但是如果是 姓名
那么就會讓你選擇是否唯一
數(shù)字
的話會讓你選擇范圍, 默認值等
等確定好了, 我們就可以點擊右下角進行生成隨機測試數(shù)據(jù)
通過結(jié)果可以看到生成十一萬測試數(shù)據(jù)一共用時十一秒, 比第一種方法速度快很多, 推薦使用
到此這篇關(guān)于MySQL實現(xiàn)批量插入測試數(shù)據(jù)的方式總結(jié)的文章就介紹到這了,更多相關(guān)MySQL插入數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Linux系統(tǒng)下mysqlcheck修復(fù)數(shù)據(jù)庫命令(詳解)
下面小編就為大家?guī)硪黄狶inux系統(tǒng)下mysqlcheck修復(fù)數(shù)據(jù)庫命令(詳解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,祝大家游戲愉快哦2016-12-12mssql2008 自定義表類型實現(xiàn)(批量插入或者修改)
在做大型網(wǎng)站或者系統(tǒng)的時候,經(jīng)常會遇到個問題就是批量插入或者修改數(shù)據(jù)庫;今天這邊不講SqlBulkCopy,只簡單講sql自定義表類型,感興趣的朋友可以了解下哦,希望本文對你有所幫助2013-01-01MYSQL數(shù)據(jù)庫Innodb?引擎mvcc鎖實現(xiàn)原理
這篇文章主要介紹了MYSQL數(shù)據(jù)庫Innodb?引擎mvcc鎖實現(xiàn)原理,但是mvcc?的實現(xiàn)原理是什么呢?下文我們就來實例說明來mvcc?的實現(xiàn)原理,感興趣的小伙伴可以參考一下2022-05-05MySQL判別InnoDB表是獨立表空間還是共享表空間的方法詳解
這篇文章主要給大家介紹了關(guān)于MySQL判別InnoDB表是獨立表空間還是共享表空間的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09