1. 程式人生 > >如何錄入百萬測試資料

如何錄入百萬測試資料

對文章稍有補充,因我的工作電腦環境可能和原作者的略有不同。

我的電腦環境是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:資料庫這一塊還得多多加強啊奮鬥