Mysql 生成100w條測試數(shù)據(jù)

https://nsimple.top/archives/mysql-create-million-data.html

有時候我們需要對大數(shù)據(jù)進(jìn)行測試,本地一般沒有那么多數(shù)據(jù),就需要我們自己生成一些。下面會借助內(nèi)存表的特點進(jìn)行生成百萬條測試數(shù)據(jù)。

創(chuàng)建一個臨時內(nèi)存表, 做數(shù)據(jù)插入的時候會比較快些

SQL

-- 創(chuàng)建一個臨時內(nèi)存表DROPTABLEIFEXISTS`vote_record_memory`;CREATETABLE`vote_record_memory`(`id`int(10)unsignedNOTNULLAUTO_INCREMENT,`user_id`varchar(20)NOTNULLDEFAULT'',`vote_num`int(10)unsignedNOTNULLDEFAULT'0',`group_id`int(10)unsignedNOTNULLDEFAULT'0',`status`tinyint(2)unsignedNOTNULLDEFAULT'1',`create_time`datetimeNOTNULLDEFAULT'0000-00-00 00:00:00',PRIMARYKEY(`id`),KEY`index_user_id`(`user_id`)USINGHASH)ENGINE=InnoDBAUTO_INCREMENT=1DEFAULTCHARSET=utf8;

-- 創(chuàng)建一個普通表,用作模擬大數(shù)據(jù)的測試用例

SQL

DROPTABLEIFEXISTS`vote_record`;CREATETABLE`vote_record`(`id`int(10)unsignedNOTNULLAUTO_INCREMENT,`user_id`varchar(20)NOTNULLDEFAULT''COMMENT'用戶Id',`vote_num`int(10)unsignedNOTNULLDEFAULT'0'COMMENT'投票數(shù)',`group_id`int(10)unsignedNOTNULLDEFAULT'0'COMMENT'用戶組id 0-未激活用戶 1-普通用戶 2-vip用戶 3-管理員用戶',`status`tinyint(2)unsignedNOTNULLDEFAULT'1'COMMENT'狀態(tài) 1-正常 2-已刪除',`create_time`int(10)unsignedNOTNULLDEFAULT'0000-00-00 00:00:00'COMMENT'創(chuàng)建時間',PRIMARYKEY(`id`),KEY`index_user_id`(`user_id`)USINGHASHCOMMENT'用戶ID哈希索引')ENGINE=InnoDBDEFAULTCHARSET=utf8COMMENT='投票記錄表';

為了數(shù)據(jù)的隨機(jī)性和真實性,我們需要創(chuàng)建一個可生成長度為n的隨機(jī)字符串的函數(shù)。

SQL

-- 創(chuàng)建生成長度為n的隨機(jī)字符串的函數(shù)DELIMITER// -- 修改MySQL delimiter:'//'DROPFUNCTIONIFEXISTS`rand_string`//SETNAMES utf8//CREATEFUNCTION`rand_string`(nINT)RETURNSVARCHAR(255)CHARSET'utf8'BEGINDECLAREchar_strvarchar(100)DEFAULT'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';DECLAREreturn_strvarchar(255)DEFAULT'';DECLAREiINTDEFAULT0;WHILEi

為了操作方便,我們再創(chuàng)建一個插入數(shù)據(jù)的存儲過程

SQL

-- 創(chuàng)建插入數(shù)據(jù)的存儲過程DROPPROCEDUREIFEXISTS`add_vote_record_memory`//CREATEPROCEDURE`add_vote_record_memory`(INnINT)BEGINDECLAREiINTDEFAULT1;DECLAREvote_numINTDEFAULT0;DECLAREgroup_idINTDEFAULT0;DECLAREstatusTINYINTDEFAULT1;WHILEi

開始執(zhí)行存儲過程,等待生成數(shù)據(jù)(10W條生成大約需要40分鐘)

SQL

-- 調(diào)用存儲過程 生成100W條數(shù)據(jù)CALLadd_vote_record_memory(1000000);

查詢內(nèi)存表已生成記錄(為了下步測試,目前僅生成了105645條)

SQL

SELECTcount(*)FROM`vote_record_memory`;-- count(*)-- 105646

把數(shù)據(jù)從內(nèi)存表插入到普通表中(10w條數(shù)據(jù)13s就插入完了)

SQL

INSERTINTOvote_recordSELECT*FROM`vote_record_memory`;

查詢普通表已的生成記錄

SQL

SELECTcount(*)FROM`vote_record`;-- count(*)-- 105646

如果一次性插入普通表太慢,可以分批插入,這就需要寫個存儲過程了:

SQL

-- 參數(shù)n是每次要插入的條數(shù)-- lastid是已導(dǎo)入的最大idCREATEPROCEDURE`copy_data_from_tmp`(INnINT)BEGINDECLARElastidINTDEFAULT0;SELECTMAX(id)INTOlastidFROM`vote_record`;INSERTINTO`vote_record`SELECT*FROM`vote_record_memory`whereid>lastidLIMITn;END

調(diào)用存儲過程:

SQL

-- 調(diào)用存儲過程 插入60w條CALLcopy_data_from_tmp(600000);

標(biāo)簽:?mysql,?原創(chuàng),?大數(shù)據(jù)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容