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

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

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

產(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ǔ)過(guò)程
插入角色表
-- 插入角色數(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;
插入用戶(hù)表
-- 插入用戶(hù)數(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ǔ)過(guò)程
-- 執(zhí)行存儲(chǔ)過(guò)程,往dept表添加10萬(wàn)條數(shù)據(jù) CALL insert_role(100000); -- 執(zhí)行存儲(chǔ)過(guò)程,往emp表添加100萬(wàn)條數(shù)據(jù),編號(hào)從100000開(kāi)始 CALL insert_user(100000,1100000);
總結(jié)
執(zhí)行用時(shí) 10w數(shù)據(jù)差不多半分鐘, 100w數(shù)據(jù)超過(guò)了20分鐘, 同時(shí) user的存儲(chǔ)還卡死很久...
最后都成功新增, 但是自動(dòng)遞增值和行數(shù)不一致, 這個(gè)我也不知道因?yàn)樯?..

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

user表

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


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

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

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

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

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

通過(guò)結(jié)果可以看到生成十一萬(wàn)測(cè)試數(shù)據(jù)一共用時(shí)十一秒, 比第一種方法速度快很多, 推薦使用
到此這篇關(guān)于MySQL實(shí)現(xiàn)批量插入測(cè)試數(shù)據(jù)的方式總結(jié)的文章就介紹到這了,更多相關(guān)MySQL插入數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MySQL和Oracle批量插入SQL的通用寫(xiě)法示例
- MySQL通過(guò)函數(shù)存儲(chǔ)過(guò)程批量插入數(shù)據(jù)
- Mysql批量插入數(shù)據(jù)時(shí)該如何解決重復(fù)問(wèn)題詳解
- MySQL之批量插入的4種方案總結(jié)
- MyBatis實(shí)現(xiàn)MySQL批量插入的示例代碼
- mysql大批量插入數(shù)據(jù)的正確解決方法
- python批量插入數(shù)據(jù)到mysql的3種方法
- 你一定用的上的MySQL批量插入技巧分享
- mysql數(shù)據(jù)庫(kù)數(shù)據(jù)批量插入的實(shí)現(xiàn)
相關(guān)文章
mysql下怎樣運(yùn)行腳本以運(yùn)行niuzi.sql為例
mysql下運(yùn)行腳本,有兩種方法,都是在命令行下進(jìn)行的,需要的朋友可以記錄下2014-07-07
mysql varchar類(lèi)型求和實(shí)例操作
在本文里我們給大家分享了關(guān)于mysql varchar類(lèi)型求和實(shí)例操作以及相關(guān)知識(shí)點(diǎn),需要的朋友們學(xué)習(xí)參考下。2019-03-03
Linux系統(tǒng)下mysqlcheck修復(fù)數(shù)據(jù)庫(kù)命令(詳解)
下面小編就為大家?guī)?lái)一篇Linux系統(tǒng)下mysqlcheck修復(fù)數(shù)據(jù)庫(kù)命令(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,祝大家游戲愉快哦2016-12-12
mssql2008 自定義表類(lèi)型實(shí)現(xiàn)(批量插入或者修改)
在做大型網(wǎng)站或者系統(tǒng)的時(shí)候,經(jīng)常會(huì)遇到個(gè)問(wèn)題就是批量插入或者修改數(shù)據(jù)庫(kù);今天這邊不講SqlBulkCopy,只簡(jiǎn)單講sql自定義表類(lèi)型,感興趣的朋友可以了解下哦,希望本文對(duì)你有所幫助2013-01-01
MYSQL數(shù)據(jù)庫(kù)Innodb?引擎mvcc鎖實(shí)現(xiàn)原理
這篇文章主要介紹了MYSQL數(shù)據(jù)庫(kù)Innodb?引擎mvcc鎖實(shí)現(xiàn)原理,但是mvcc?的實(shí)現(xiàn)原理是什么呢?下文我們就來(lái)實(shí)例說(shuō)明來(lái)mvcc?的實(shí)現(xiàn)原理,感興趣的小伙伴可以參考一下2022-05-05
MySQL判別InnoDB表是獨(dú)立表空間還是共享表空間的方法詳解
這篇文章主要給大家介紹了關(guān)于MySQL判別InnoDB表是獨(dú)立表空間還是共享表空間的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-09-09

