当前位置: 首页 > 科技观察

详解MySQL如何按表创建千万级的压测数据

时间:2023-03-18 18:28:37 科技观察

详细讲解MySQL如何根据表创建千万级压测数据如何使用MySQL循环和存储过程为特定表创建千万级数据。1.准备测试表CREATETABLE`username`(`uid`INT(11)UNSIGNEDNOTNULLdefault1235678901,`username`VARCHAR(20),`email`VARCHAR(30),`password`VARCHAR(32),`birthday`date,`性别`VARCHAR(10),avatarMEDIUMBLOB,PRIMARYKEY(`uid`))ENGINE=INNODBDEFAULTCHARSET=utf8;2.随机数据生成MySQL自带随机数生成函数RAND(),可以生成0-1的浮点数RAND函数生成随机数:千万级压测数据"src="http://p3.pstatp.com/large/pgc-image/18a9e01795184b6b9230e47f707ee6a9"width="348"height="148">3.这里随机生成for固定数量的字符串使用mysql循环,循环使用WHILE循环,循环使用stringsplicingfunctionCONCATSETGLOBALlog_bin_trust_function_creators=1;CREATEDEFINER=`root`@`%`FUNCTION`rand_string`(nINT)RETURNSVARCHAR(255)CHARSETutf8BEGINDECLAREchars_strVARCHAR(100)DEFAULT'hwbtestABCDEFG23141HIJ6712dfghjkqwevbnqmwerqwerqwreqw214123e1214c12dssaf89';DECLAREreturn_strVARCHAR(255)DEFAULT'';DECLAREiINTDEFAULT0;WHILEi通过以上方法可以添加用户名和密码如何添加邮箱:可以直接在insert的value对应字段写concat(rand_string(5),'@qq.com')4.随机生成DATE和DATETIME类型(1)DATEtypeCREATEDEFINER=`root`@`%`FUNCTION`randDate`()RETURNSVARCHAR(255)CHARSETutf8BEGINDECLAREaDateCHAR(10)DEFAULT'';/*CONCAT(1949+FLOOR((RAND()*70))表示1949年到2019年的随机数据--LPAD(FLOOR(1+(RAND()*12)),2,0)表示月份的生成,小于10会自动补0--LPAD(FLOOR(3+(RAND()*8)),2,0))表示第3到第10个随机数的数据*/SETaDate=CONCAT(1949+FLOOR((RAND()*70)),'-',LPAD(FLOOR(1+(RAND()*12)),2,0),'-',LPAD(FLOOR(3+(RAND()*8)),2,0));RETURNaDate;END;千万压测数据"src="http://p1.pstatp.com/large/pgc-image/80b27cacdcd84a749f35acaecc805e8d"width="640"height="409">关于LPAD功能,具体用作月日补零函数!有效介绍如下:Returnsthestringstr:str,left-paddedwiththestringpadstrtoalengthoflencharacters.Ifstrislongerthanlen:N,thereturnedtosqlencharactersshorteners>SELECTLPAD('hi',4,'??');->'??hi'mysql>SELECTLPAD('hi',1,'??');->'h'(2)DATETIME类型刚才写的randDate上的转换:CREATEDEFINER=`root`@`%`FUNCTION`randDateTime`()RETURNSVARCHAR(255)CHARSETutf8BEGINDECLAREaDateTimeCHAR(19)DEFAULT'';SETaDateTime=CONCAT(CONCAT(1949+FLOOR((RAND()*70)),'-',LPAD(FLOOR(1+(RAND()*12)),2,0),'-',LPAD(FLOOR(3+(RAND()*8)),2,0)),'',CONCAT(LPAD(FLOOR(0+(RAND()*23)),2,0),':',LPAD(FLOOR(0+(RAND()*60)),2,0),':',LPAD(FLOOR(0+(RAND()*60)),2,0)));RETURNaDateTime;结束;5.将数据循环插入到定义数据循环的存储过程中:DELIMITER//CREATEPROCEDUREinsertUser()BEGINDECLAREnumINT;SETnum=1;WHILEnum<100000DOINSERTINTOusername(uid,username,email,PASSWORD,birthday,gender,avatar)VALUES(num,rand_string(15),concat(rand_string(5),'@qq.com'),rand_string(32),randDate(),'Male',NULL);SETnumnum=num+1;ENDWHILE;commit;END;//调用存储的程序:CALLinsertUser;