MySQL快速生成本地測試數據
阿新 • • 發佈:2018-03-07
cde function using n) abcde 行存儲 roc prim etime
利用數據的存儲過程生成測試數據:
我們可以通過數據庫的的 INSERT 語句直接在存儲過程中向普通數據表中添加數據,但是
當我們添加到百萬數據後,往普通表插入測試數據的性能就會明顯降低。所以在這裏建議
使用內存表做一個中間鋪墊,在內存表中生成完百萬條數據後,在一次性的插入普通數據表
即可完成百萬條測試數據生成。下面我們看過程:
第一步創建內存表:
CREATE TABLE `vote_record_memory` ( `id` INT (11) NOT NULL AUTO_INCREMENT, `user_id` VARCHAR (20) NOT NULL, `vote_id` INT (11) NOT NULL, `group_id` INT (11) NOT NULL, `create_time` datetime NOT NULL, PRIMARY KEY (`id`), KEY `index_id` (`user_id`) USING HASH ) ENGINE = MEMORY AUTO_INCREMENT = 1 DEFAULT CHARSET = utf8
第二步創建普通表:
CREATE TABLE `vote_record` ( `id`INT (11) NOT NULL AUTO_INCREMENT, `user_id` VARCHAR (20) NOT NULL, `vote_id` INT (11) NOT NULL, `group_id` INT (11) NOT NULL, `create_time` datetime NOT NULL, PRIMARY KEY (`id`), KEY `index_user_id` (`user_id`) USING HASH ) ENGINE = INNODB AUTO_INCREMENT =1 DEFAULT CHARSET = utf8
註意:內存表和普通表的區別在與他們的存儲引擎不同,在SQL代碼中已用紅色加粗標識。
在插入的過程中,為了讓數據更接近真實性,我們創建一個隨機參數的函數輔助數據的生成。
第三步創建隨機生成函數:
DELIMITER //
CREATE FUNCTION `rand_string`(n INT) RETURNS varchar(255) CHARSET latin1 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 //
第四步創建存儲過程:
DELIMITER //
CREATE PROCEDURE `add_vote_memory`(n int,len int) BEGIN DECLARE i INT DEFAULT 1; WHILE (i <= n ) DO INSERT into vote_record_memory(user_id,vote_id,group_id,create_time ) VALUEs (rand_string(len),FLOOR(RAND() * 1000),FLOOR(RAND() * 100) ,now() ); set i=i+1; END WHILE; END //
第五步執行存儲過程:生成 100 萬條數據,user_id 長度 20 個字符
CALL add_vote_memory(1000000,20);
註意:在生成的過程共可能會出現內存不足或者溢出提示,需要設置 my.cnf 參數 max_heap_table_size
max_heap_table_size = 4096M
定義 max_heap_table_size 為 4G 的表示數據表在內存中的存儲大小,保證足夠的空間
存儲數據,因為內存表會把表結構存放在磁盤上,把數據放在內存中
第六步查看內存表的數據條數:
select count(*) from vote_record_memory;
註意:如果條數沒有達到你生成的條數,請在等一會或者刷新一下數據統計條數最終達到你要生成的冊數條數,因為
數據量大會有一定的延時,以查最終出來的數據結果為準。(如果不在乎數據條數的多少可以忽略)
第七步將內存表的數據插入到普通表:
INSERT into vote_record SELECT * from vote_record_memory;
第八步查看普通表的數據:
select count(*) from vote_record;
第九步刪除內存表的數據:
delete from vote_record_memory;
到此就完成了。
MySQL快速生成本地測試數據