如何錄入百萬測試資料
阿新 • • 發佈:2019-02-13
對文章稍有補充,因我的工作電腦環境可能和原作者的略有不同。
我的電腦環境是WIN7x64+PHPStudy2017+nginx+PHP7,資料庫管理工具用的navicat。
為了避免原文失效,我這邊稍作整理髮一遍。(PS:實戰通過)
1、生成思路 利用mysql記憶體表插入速度快的特點,先利用函式和儲存過程在記憶體表中生成資料,然後再從記憶體表插入普通表中 2、建立記憶體表及普通表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
3、建立函式及儲存過程
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
CREATE PROCEDURE `add_vote_memory`(IN n 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(20),FLOOR(RAND() * 1000),FLOOR(RAND() * 100) ,now() );
set i=i+1;
END WHILE;
END
4、呼叫儲存過程 (這裡是我在按照原文,走不通後谷歌找來的) 根據不同系統修改記憶體限制 修改my.ini tmp_table_size=4000M max_heap_table_size = 4000M 修改後重啟 mysql 然後執行
CALL add_vote_memory(1000000)
修改後,一百萬資料也不要很久,不到5分鐘。
5、從記憶體表插入到普通表
INSERT into vote_record SELECT * from vote_record_memory
執行這個也很快,喝口水就好了,有圖有真相。
PS:資料庫這一塊還得多多加強啊