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ù)