天天看點

MySQL 程式設計技巧(一)

 工作中我們可能會建立類似的輔助表,并填充一定量的資料來完成工作。

         例如:生成一連串連續的數值。

         表:

         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,如需轉載請自行聯系原作者

繼續閱讀