MySQL使用儲存過程插入千萬級資料如何提公升效率?

2021-08-07 14:30:18 字數 2853 閱讀 5140

-- mysql測試任務:使用儲存過程,往表中插入千萬級資料,根據索引優化速度

-- 1.使用索引查詢

-- 2.不使用索引查

-- 3.比較兩者查詢速度的差異

-- 1.建立索引測試表

drop table if exists index_test;

create table index_test(

id bigint(20) primary key not null auto_increment,

user varchar(16) default null,

psd varchar(64) default null

/*psd mediumint default 0 儲存隨機資料*/

)engine=myisam default charset=utf8;

/*myisam儲存引擎不產生引擎事務,資料插入速度極快,為方便快速插入千萬條測試資料,等我們插完資料,再把儲存型別修改為innodb*/

-- 2.建立儲存過程,插入資料

delimiter $$

use `xscj`$$

drop procedure if exists `insert_data`$$

create definer=`root`@`localhost` procedure `insert_data`(in num int)

begin

declare n int default 1;/*定義乙個變數,儲存當前執行的次數*/

while n <= num

do

insert into index_test(user,psd) values(concat('使用者',n),password(n));/*concat()字串連線、password()加密函式*/

/*insert into index_test(user,psd) values(concat('使用者',n),ret_pwd());*/

set n=n+1;

end while;

end$$

delimiter ;

-- 3.建立乙個函式,隨機生成密碼,並返回給pwd欄位

delimiter $$

create

/*[definer = ]*/

function `xscj`.`ret_pwd`()

returns int(5)

/*language sql

| [not] deterministic

|

| sql security

| comment 'string'*/

begin

declare r int default 0;

set r = floor(10+rand()*1000);

return r;

end$$

delimiter ;

-- 4.呼叫儲存過程,插入100萬條資料(總耗時:6 min 35 sec)

-- 6.通過主鍵索引查詢,不使用普通索引(總耗時:0.022 sec)

-- 7.不通過索引查詢(總耗時:7.058 sec)

select * from index_test where user='使用者1950000'

-- 8.為user欄位建立普通索引,並通過該索引進行查詢

create index index_user on index_test (user asc);-- (總耗時:1 min 20 sec)

select * from index_test where user='使用者1950000';-- (總耗時:0.078 sec)

-- 9.使用user、pwd聯合查詢,由於user新增了索引,pwd未新增索引,故進行篩選查詢是仍舊採用全表掃瞄,因此時間略有提公升(總耗時:7.086 sec)

select * from index_test where user='使用者1950000' or psd='*b810355cf0690506e5295aa66741d44e6af4e61d';

-- 10.對user、pwd欄位建立聚合索引後,再查詢

create index index_userpwd on index_test (user,psd asc);-- (總耗時:2 min 25 sec)

select * from index_test where user='使用者1950000' or psd='*b810355cf0690506e5295aa66741d44e6af4e61d';-- (總耗時:13.014 sec)

-- 檢視表結構

desc index_test;

-- 查詢表資料

select * from index_test;

-- 刪除表資料

delete from index_test;

-- 刪除索引

drop index index_user on `index_test`;

drop index index_userpwd on `index_test`;

mysql利用儲存過程批量插入一千萬資料(半小時)

示例 向user表中插入一千萬條資料,其中user id11位手機號隨機,可以重複 age為18 27之間 count隨機金額,八位小數 status二百萬資料為1,八百萬資料為0。如果該名字儲存過程已存在,則刪除 drop procedure ifexists proc initdata1 建立 ...

mysql使用儲存過程 函式實現批量插入

寫這邊文章的目的,是想結合mysql 儲存過程 函式完成乙個批量刪除的功能吧.正好也好加深下對procedure和function的熟練操作吧.廢話不多說,我就直接上表結構啦哈,如下 create table dept id int unsigned primary key auto increme...

mysql使用儲存過程 函式實現批量插入

寫這邊文章的目的,是想結合mysql 儲存過程 函式完成乙個批量刪除的功能吧.正好也好加深下對procedure和function的熟練操作吧.廢話不多說,我就直接上表結構啦哈,如下 create table dept id int unsigned primary keyauto incremen...