標籤:執行 bst 插入 tab 空間 delete efault 提示 set
利用資料的預存程序產生測試資料:
我們可以通過資料庫的的 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 latin1BEGIN 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快速產生本地測試資料