前言
為了體現不加索引和新增索引的區別,需要使用百萬級的資料,但是百萬資料的表,如果使用一條條新增,特別繁瑣又麻煩,這裡使用儲存過程快速新增資料,用時大概4個小時。
建立一個使用者表
CREATE TABLE `t_sales` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(32) COLLATE utf8_bin DEFAULT NULL COMMENT '使用者名稱',
`password` varchar(64) COLLATE utf8_bin DEFAULT NULL COMMENT '密碼 MD5儲存',
`register_time` timestamp NULL DEFAULT NULL COMMENT '註冊時間',
`type` int(1) DEFAULT NULL COMMENT '使用者型別 1,2,3,4 隨機',
PRIMARY KEY (`id`),
KEY `idx_username` (`username`) USING BTREE
)
然後建立儲存過程,批量新增資料。
- 使用者名稱以常量和數字拼接
- 密碼是MD5密碼
- 註冊時間是當前時間隨機往前推幾天
- type是取1-4隨機範圍值
create procedure salesAdd()
begin
declare i int default 11;
while i <= 4000000 do
insert into blog.t_sales
(`username`,`password`,`register_time`,type) values
(concat("jack",i),MD5(concat("psswe",i)),from_unixtime(unix_timestamp(now()) - floor(rand() * 800000)),floor(1 + rand() * 4));
set i = i + 1;
end while;
end
然後呼叫儲存過程
call salesAdd()
改進版
雖然使用儲存過程新增資料相對一個個新增更加便捷,快速,但是新增幾百萬資料要花幾個小時時間也是很久的,後面在網上找到不少資料,發現mysql每次執行一條語句都預設自動提交,這個操作非常耗時,所以在在新增去掉自動提交。設定 SET AUTOCOMMIT = 0;
create procedure salesAdd()
begin
declare i int default 1;
set autocommit = 0;
while i <= 4000000 do
insert into blog.t_sales
(`username`,`password`,`register_time`,type) values
(concat("jack",i),MD5(concat("psswe",i)),from_unixtime(unix_timestamp(now()) - floor(rand() * 800000)),floor(1 + rand() * 4));
set i = i + 1;
end while;
set autocommit = 1;
end
執行時間387秒,約為六分鐘,其中還有一半時間用於md5、隨機數的計算。
[SQL]
call salesAdd();
受影響的行: 0
時間: 387.691s