MySQL生成千萬測試數(shù)據(jù)以及遇到的問題
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ǔ)過程和函數(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開始時(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ǔ)過程 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ǔ)過程
存儲(chǔ)過程當(dāng)中的數(shù)字就是要生成的數(shù)量,自行填寫。
CALL add_t_user_memory(10);
100萬大概需要8分鐘!

5、遇到的問題
創(chuàng)建存儲(chǔ)過程和執(zhí)行的時(shí)候可能會(huì)出現(xiàn)以下兩種問題:
5.1、1449錯(cuò)誤
在創(chuàng)建存儲(chǔ)過程的時(shí)候可能會(huì)出現(xiàn)1449:錯(cuò)誤:
mysql 1449 : The user specified as a definer (‘root’@‘%’) does not exist
經(jīng)查詢是權(quá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ù)自己電腦自行修改。如果是線上服務(wù)器,最好不要自行修改,還是跟運(yùn)維多溝通溝通,避免出現(xiàn)問題。

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

6、同步數(shù)據(jù)
INSERT INTO t_user SELECT * FROM t_user_memory;
總結(jié)
到此這篇關(guān)于MySQL生成千萬測試數(shù)據(jù)以及遇到的問題的文章就介紹到這了,更多相關(guān)MySQL生成千萬測試數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySQL優(yōu)化之如何寫出高質(zhì)量sql語句
在數(shù)據(jù)庫日常維護(hù)中,最常做的事情就是SQL語句優(yōu)化,因?yàn)檫@個(gè)才是影響性能的最主要因素。這篇文章主要給大家介紹了關(guān)于MySQL優(yōu)化之如何寫出高質(zhì)量sql語句的相關(guān)資料,需要的朋友可以參考下2021-05-05
MySQL group by對(duì)單字分組序和多字段分組的方法講解
今天小編就為大家分享一篇關(guān)于MySQL group by對(duì)單字分組序和多字段分組的方法講解,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧2019-03-03
SQL使用WHERE條件語句的項(xiàng)目實(shí)踐
本文將介紹WHERE子句中使用的通用語法,它還將概述如何在單個(gè)WHERE子句中組合多個(gè)搜索條件謂詞以更細(xì)粒度的方式過濾數(shù)據(jù),以及如何使用NOT操作符排除而不是包含滿足給定搜索條件的行,感興趣的可以了解一下2023-09-09
MySQL下將一個(gè)表的數(shù)據(jù)插入到另外一個(gè)表的實(shí)現(xiàn)語句
開發(fā)中,我們經(jīng)常需要將一個(gè)表的數(shù)據(jù)插入到另外一個(gè)表,有時(shí)還需要指定導(dǎo)入字段,雖然這個(gè)實(shí)現(xiàn)起來非常簡單,但是還是會(huì)困擾許多新手,因此專門發(fā)一篇文章備查。2009-09-09
MySQL服務(wù)器默認(rèn)安裝之后調(diào)節(jié)性能的方法
在面試MySQL DBA或者那些打算做MySQL性能優(yōu)化的人時(shí),我最喜歡問題是:MySQL服務(wù)器按照默認(rèn)設(shè)置安裝完之后,應(yīng)該做哪些方面的調(diào)節(jié)呢?2011-05-05

