最近開始總結自己學習的Mysql的經驗,在這裡跟大家分享。很希望大家很拍板磚,謝謝。
先說說,為什麼我要學習Mysql的預存程序,因為Mysql在單純的Script(指令碼)裡面,不支援迴圈。大家可以參考相關的文檔。
先給出代碼:
DELIMITER $$
DROP PROCEDURE IF EXISTS `dowhile` $$
CREATE PROCEDURE `dowhile`()
DETERMINISTIC
BEGIN
DECLARE v1 INT DEFAULT 1000;
declare tablename varchar(10) default 'testTable';
declare createString varchar(1000);
while v1 <> 0 DO
set @nextTable = concat(tablename,v1);
set createString = concat("create table `",@nextTable);
set createString = concat(createString,"` ( `id` int null, `name` varchar(200) null); ");
set @mytable = createString;
select @mytable;
PREPARE stmt_name FROM @mytable;
EXECUTE stmt_name ;
DEALLOCATE PREPARE stmt_name;
set v1 = v1 -1;
END while;
END$$
DELIMITER ;
第一步:建立一個Mysql預存程序,必須要注意的地方是:一定要使用 DELIMITER(定界符這個)關鍵字,否則會產生ErrorNum:1064。這點無論是使用命令列還是Mysql Tools(Workbench)都必須遵守。
具體參考:http://dev.mysql.com/doc/refman/5.1/en/stored-programs-defining.html ,又一次證明了,仔細閱讀文檔很重要。
更多參考:http://dev.mysql.com/doc/refman/5.1/en/stored-routines.html
第二步:使用迴圈,必須在Mysql預存程序中,希望Mysql新版本可以進行改進。
原文be used in the body of stored programs: Stored procedures and functions, triggers, and events. These objects are defined in terms of SQL code that is stored on the server for later invocation
具體參考:http://dev.mysql.com/doc/refman/5.1/en/sql-syntax-compound-statements.html
第三步:使用 PREPARE命令,開啟一個Stmt,不要忘記關上。
具體參考:http://dev.mysql.com/doc/refman/5.1/en/sql-syntax-prepared-statements.html
小結:
我這裡使用迴圈,但是實際完成建表過程,只實現了300次。是不是在預存程序中,迴圈有限制?
探索1:迴圈限制,設定while迴圈最大迴圈數為100000,沒有任何問題。時間:0.406秒 。(雙核 2.47)
探索2: 迴圈數為10000000,沒有任何問題。時間:27.753秒。
探索3: 迴圈數為20000000,沒有任何問題。時間:48.578秒。
超過30秒的限制。
當超過10分鐘之後,串連斷開。主要分析,發現Workbench有一個自己的資料庫連接時間,10分鐘。
通過閱讀發現了Mysql的逾時設定是interactive_timeout = wait_timeout:28800s (480min) 6小時。