MySQL生成千萬(wàn)測(cè)試數(shù)據(jù)以及遇到的問(wèn)題
1、創(chuàng)建基礎(chǔ)表結(jié)構(gòu)
CREATE TABLE `t_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `c_user_id` varchar(36) NOT NULL DEFAULT '', `c_name` varchar(22) NOT NULL DEFAULT '', `c_province_id` int(11) NOT NULL, `c_city_id` int(11) NOT NULL, `create_time` datetime NOT NULL, PRIMARY KEY (`id`), KEY `idx_user_id` (`c_user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
2、創(chuàng)建內(nèi)存表
直接往實(shí)表添加數(shù)據(jù)比較慢,所以我們先插入內(nèi)存表,然后再同步到實(shí)表。
CREATE TABLE `t_user_memory` ( `id` int(11) NOT NULL AUTO_INCREMENT, `c_user_id` varchar(36) NOT NULL DEFAULT '', `c_name` varchar(22) NOT NULL DEFAULT '', `c_province_id` int(11) NOT NULL, `c_city_id` int(11) NOT NULL, `create_time` datetime NOT NULL, PRIMARY KEY (`id`), KEY `idx_user_id` (`c_user_id`) ) ENGINE=MEMORY DEFAULT CHARSET=utf8mb4;
3、創(chuàng)建存儲(chǔ)過(guò)程和函數(shù)
# 創(chuàng)建隨機(jī)字符串 delimiter $$ CREATE DEFINER = `root` @`%` FUNCTION `randStr` ( n INT ) RETURNS VARCHAR ( 255 ) CHARSET utf8mb4 DETERMINISTIC BEGIN DECLARE chars_str VARCHAR ( 100 ) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; 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() * 62 ), 1 )); SET i = i + 1; END WHILE; RETURN return_str; END $$ # 創(chuàng)建隨機(jī)時(shí)間的函數(shù),sd和ed兩個(gè)入?yún)⒋砩傻臅r(shí)間是這個(gè)時(shí)間范圍內(nèi)的。sd開(kāi)始時(shí)間,ed截止時(shí)間。 CREATE DEFINER = `root` @`%` FUNCTION `randDataTime` ( sd DATETIME, ed DATETIME ) RETURNS datetime DETERMINISTIC BEGIN DECLARE sub INT DEFAULT 0; DECLARE ret DATETIME; SET sub = ABS( UNIX_TIMESTAMP( ed )- UNIX_TIMESTAMP( sd )); SET ret = DATE_ADD( sd, INTERVAL FLOOR( 1+RAND ()*( sub - 1 )) SECOND ); RETURN ret; END $$ # 創(chuàng)建插入數(shù)據(jù)存儲(chǔ)過(guò)程 CREATE DEFINER = `root` @`%` PROCEDURE `add_t_user_memory` ( IN n INT ) BEGIN DECLARE i INT DEFAULT 1; WHILE ( i <= n ) DO INSERT INTO t_user_memory ( c_user_id, c_name, c_province_id, c_city_id, create_time ) VALUES ( uuid(), randStr ( 20 ), FLOOR( RAND() * 1000 ), FLOOR( RAND() * 100 ), randDataTime ( "2020-01-01", "2021-01-01" )); SET i = i + 1; END WHILE; END $$ delimiter ;
4、執(zhí)行存儲(chǔ)過(guò)程
存儲(chǔ)過(guò)程當(dāng)中的數(shù)字就是要生成的數(shù)量,自行填寫(xiě)。
CALL add_t_user_memory(10);
100萬(wàn)大概需要8分鐘!

5、遇到的問(wèn)題
創(chuàng)建存儲(chǔ)過(guò)程和執(zhí)行的時(shí)候可能會(huì)出現(xiàn)以下兩種問(wèn)題:
5.1、1449錯(cuò)誤
在創(chuàng)建存儲(chǔ)過(guò)程的時(shí)候可能會(huì)出現(xiàn)1449:錯(cuò)誤:
mysql 1449 : The user specified as a definer (‘root’@‘%’) does not exist
經(jīng)查詢(xún)是權(quán)限問(wèn)題,解決辦法:
運(yùn)行sql:
grant all privileges on *.* to 'root'@'%' identified by "."; flush privileges;
5.2、1114錯(cuò)誤
當(dāng)生成數(shù)量大的時(shí)候就可能會(huì)報(bào)這個(gè)錯(cuò)誤:

解決方法:在my.cnf中修改max_heap_table_size = 256M tmp_table_size = 256M,重啟MySQL服務(wù)(my.cnf在mysql安裝路徑),如果還不夠用根據(jù)自己電腦自行修改。如果是線(xiàn)上服務(wù)器,最好不要自行修改,還是跟運(yùn)維多溝通溝通,避免出現(xiàn)問(wèn)題。

show VARIABLES like '%TABLE_size%';
改完可以在這進(jìn)行查看:

6、同步數(shù)據(jù)
INSERT INTO t_user SELECT * FROM t_user_memory;
總結(jié)
到此這篇關(guān)于MySQL生成千萬(wàn)測(cè)試數(shù)據(jù)以及遇到的問(wèn)題的文章就介紹到這了,更多相關(guān)MySQL生成千萬(wàn)測(cè)試數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談mysql的子查詢(xún)聯(lián)合與in的效率
本文是作者在實(shí)際產(chǎn)品測(cè)試中遇到的問(wèn)題,繼而作了相關(guān)總結(jié),具有一定參考價(jià)值,需要的朋友可以了解下。2017-10-10
MySQL使用show?effective?grants查看權(quán)限官方解讀
這篇文章主要為大家介紹了MySQL使用show?effective?grants查看權(quán)限,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-07-07
MySQL數(shù)據(jù)庫(kù)case?when?then?end的詳細(xì)使用方法
在SQL語(yǔ)法中我們首先使用CASE關(guān)鍵字開(kāi)頭,然后根據(jù)不同的條件使用WHEN關(guān)鍵字,并在每個(gè)條件后面指定結(jié)果,這篇文章主要給大家介紹了關(guān)于MySQL數(shù)據(jù)庫(kù)case?when?then?end的詳細(xì)使用方法,需要的朋友可以參考下2023-12-12
Navicat for MySQL導(dǎo)出表結(jié)構(gòu)腳本的簡(jiǎn)單方法
下面小編就為大家?guī)?lái)一篇Navicat for MySQL導(dǎo)出表結(jié)構(gòu)腳本的簡(jiǎn)單方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2016-12-12
MySQL時(shí)區(qū)差8小時(shí)的多種問(wèn)題解決方法
mybatis將本地的數(shù)據(jù)傳入到mysql數(shù)據(jù)庫(kù)服務(wù)器的時(shí)候,服務(wù)器會(huì)對(duì)數(shù)據(jù)進(jìn)行檢測(cè),會(huì)把date類(lèi)型的數(shù)據(jù)自動(dòng)轉(zhuǎn)換為mysql服務(wù)器所對(duì)應(yīng)的時(shí)區(qū),即0時(shí)區(qū),所以會(huì)相差8小時(shí),本文給大家介紹了MySQL時(shí)區(qū)差8小時(shí)的問(wèn)題解決方法,需要的朋友可以參考下2024-01-01
RR與RC隔離級(jí)別下索引和鎖的測(cè)試腳本示例代碼
這篇文章主要給大家介紹了關(guān)于RR與RC隔離級(jí)別下索引和鎖的測(cè)試腳本的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-12-12

