工作中我們可能會建立類似的輔助表,并填充一定量的資料來完成工作。
例如:生成一連串連續的數值。
表:
create table nums (a int unsigned not null primary key)engine=innodb;
一般的做法是建立一個存儲過程:
delimiter $$
create procedure pCreateNums (cnt int unsigned)
begin
declare s int unsigned default 1;
truncate table Nums;
while s <= cnt do
begin
insert into Nums select s;
set s=s+1;
end;
end while;
end$$
delimiter ;
執行的時候: call pCreateNums(200000); 此時這個程式insert 插入的次數是 2W次。
下面看看優化後的存儲過程:
create procedure pFastCreateNums (cnt int unsigned)
declare s int unsigned default 1;
insert into Nums select s;
while s*2 <=cnt do
begin
insert into Nums select a+s from Nums;
set s=s*2;
end;
end while;
END $$
DELIMITER ;
執行: call pFastCreateNums(200000); 該過程會先把1插入到表中,然後當 s*2<=cnt的成立的時候執行循環,每次疊代的時候會把目前所有行的值加上s再插入到表中。 即: 先插入1 , 然後是 2, (3,4), (5,6,7,8),(9,10,11,12,13,14,15,16)以此類推。
該過程執行的時候insert減少,隻執行了17操作,最大值是2**17=131072,不過這個數已經夠我們用啦。
參考:《MySQL技術内幕-SQL程式設計》
本文轉自 位鵬飛 51CTO部落格,原文連結:http://blog.51cto.com/weipengfei/961569,如需轉載請自行聯系原作者