Mysql生成100w條測試資料

sktj發表於2018-06-06

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

有時候我們需要對大資料進行測試,本地一般沒有那麼多資料,就需要我們自己生成一些。下面會藉助記憶體表的特點進行生成百萬條測試資料。

建立一個臨時記憶體表, 做資料插入的時候會比較快些

SQL

— 建立一個臨時記憶體表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;

— 建立一個普通表,用作模擬大資料的測試用例

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`投票數`,`group_id`int(10)unsignedNOTNULLDEFAULT`0`COMMENT`使用者組id 0-未啟用使用者 1-普通使用者 2-vip使用者 3-管理員使用者`,`status`tinyint(2)unsignedNOTNULLDEFAULT`1`COMMENT`狀態 1-正常 2-已刪除`,`create_time`int(10)unsignedNOTNULLDEFAULT`0000-00-00 00:00:00`COMMENT`建立時間`,PRIMARYKEY(`id`),KEY`index_user_id`(`user_id`)USINGHASHCOMMENT`使用者ID雜湊索引`)ENGINE=InnoDBDEFAULTCHARSET=utf8COMMENT=`投票記錄表`;

為了資料的隨機性和真實性,我們需要建立一個可生成長度為n的隨機字串的函式。

SQL

— 建立生成長度為n的隨機字串的函式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

為了操作方便,我們再建立一個插入資料的儲存過程

SQL

— 建立插入資料的儲存過程DROPPROCEDUREIFEXISTS`add_vote_record_memory`//CREATEPROCEDURE`add_vote_record_memory`(INnINT)BEGINDECLAREiINTDEFAULT1;DECLAREvote_numINTDEFAULT0;DECLAREgroup_idINTDEFAULT0;DECLAREstatusTINYINTDEFAULT1;WHILEi

開始執行儲存過程,等待生成資料(10W條生成大約需要40分鐘)

SQL

— 呼叫儲存過程 生成100W條資料CALLadd_vote_record_memory(1000000);

查詢記憶體表已生成記錄(為了下步測試,目前僅生成了105645條)

SQL

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

把資料從記憶體表插入到普通表中(10w條資料13s就插入完了)

SQL

INSERTINTOvote_recordSELECT*FROM`vote_record_memory`;

查詢普通表已的生成記錄

SQL

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

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

SQL

— 引數n是每次要插入的條數– lastid是已匯入的最大idCREATEPROCEDURE`copy_data_from_tmp`(INnINT)BEGINDECLARElastidINTDEFAULT0;SELECTMAX(id)INTOlastidFROM`vote_record`;INSERTINTO`vote_record`SELECT*FROM`vote_record_memory`whereid>lastidLIMITn;END

呼叫儲存過程:

SQL

— 呼叫儲存過程 插入60w條CALLcopy_data_from_tmp(600000);

標籤: mysql原創大資料


相關文章