MySQL隨機生成百萬級數據
參考
最近再一個博客看到了一篇文章,主要是講述如何使用MySQL存儲過程和函數創建百萬級別測試數據,作者原文標題是千萬級測試數據,但是我親自測試過,超過10級別插入速度已經很慢了,而且還不能一次過創建不然會卡死。
測試環境
CPU i5@2.30GHz
內存 15GB
MySQL版本—8.0.17
MySQLWORKBENCH
1.創建數據表
創建兩張表,一張為內存表,一張為正式表,內存表主要放存儲過程生成的隨機數據,正式表再用查詢插入從內存表中獲取數據。
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`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;
1.1創建內存表
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_user_id` (`user_id`)
) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4;
2.使用存儲過程
隨機生成字符串,傳入參數是字符串長度
CREATE DEFINER=`root`@`%` FUNCTION `rand_string`(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
2.1創建存儲過程
傳入參數是創建的數據量
CREATE DEFINER=`root`@`%` 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
MySQL的存儲過程要注意兩個點:
- 1、在執行上面的語句之前要先執行DELIMITER $$,這條命令的作用是可以將分號;暫時注銷原先功能,要不然存儲過程中間的分號就會報錯。
- 2、存儲過程的名稱所用的不是單引號而是左邊鍵盤數字1左邊的反引號。
單引號 '
反引號 `
雙引號 "
2.2調用存儲過程
CALL add_vote_memory(1000000)
這里第一次使用MySQL WORKBENCH執行的時候大概在30秒左右報錯,這是 WORKBENCH的一個設置,大概就是最長的連接時間,修改方式
edit>>Preferences>>SQL Editor>>DBMS connection read timeout interval(in seconds):
大概執行時間30W數據要15分鍾以上,至於100W數據就已經沒耐心等下去了。
這里還有一個容易報錯的地方就是單表的最大容量,mysql默認每張表占據的存儲空間有一個最大值,可以修改這個最大值,具體細節可以查看配置文件.
調用存儲過程,並且參數為10W的結果:
100W就是這個時間乘以10倍,大概40分鍾左右
總結:
看別人的文章學習技巧的時候還是要自己動手操作一遍才能知道有哪些坑,因為每個人的知識邊界都不一樣,有些你認為是常識的東西說不定別人就不知道,反之亦然,所以學習編程重點就是多寫代碼多做測試。