【MySQL數據類型測試】集合類型和枚舉類型測試準備信息(第四節)

MySQL數據庫之數據類型集合類型和枚舉類型測試準備信息

針對四種數據類型:布爾類型BOOL或稱布爾類型BOOLEAN、微整型TINYTINT、枚舉類型ENUM、集合類型SET,我們已經分多篇文章篇幅給出詳細的介紹與功能測試數據,接下來我們深入介紹枚舉類型EUNM和集合類型SET。測試基於InnoDB存儲引擎上,對MySQL數據庫集合類型SET和枚舉類型ENUM的字段進行DDL變更操作,是否需要重新創建表呢?對數據庫的事務處理有何影響?對數據庫的數據服務提供有何性能影響?
(一)系統環境
硬件:DELL R510 10塊盤做的RAID5,上面跑了幾十臺虛擬機
操作系統:CentOS release 5.5 (Final)
MySQL數據庫:5.5.15-log
InnoDB存儲引擎:plugin-InnoDB 1.1.8

(二)測試數據準備
A.創建表結構的SQL命令
CREATE DATABASE mysqlops CHARACTER SET ‘utf8’ COLLATE ‘utf8_general_ci’;
USE mysqlops;

CREATE TABLE mysqlops_set_enum_bk (
ID INT NOT NULL AUTO_INCREMENT,
Work_Option set(‘JavaScript’,‘DBA’,‘SA’,‘C++’,‘NA’,‘QA’,‘Java’,‘PHP’,’’,‘Python’),
Work_City set(‘shanghai’,‘beijing’,‘hangzhou’,‘shenzhen’,‘guangzhou’,‘xiamen’,‘tianjin’,‘qingdao’,‘dalian’,‘xian’,‘other’) NOT NULL DEFAULT ‘shanghai’,
PRIMARY KEY (ID)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

B.用於分隔字符串的函數代碼
USE mysqlops;

DELIMITER $$

DROP FUNCTION IF EXISTS fun_split $$
CREATE FUNCTION fun_split(strValue VARCHAR(500),strSplit CHAR(1),iPostion TINYINT)
RETURNS VARCHAR(20) DETERMINISTIC
BEGIN
DECLARE strValue_New VARCHAR(500) DEFAULT ‘’;
DECLARE strValue_Old VARCHAR(500) DEFAULT ‘’;
DECLARE strReturn VARCHAR(20) DEFAULT ‘’;

DECLARE iLength_Old TINYINT DEFAULT 0;
DECLARE iLength_New TINYINT DEFAULT 0;
DECLARE iLength TINYINT DEFAULT 0;

SET strValue_New=SUBSTRING_INDEX(strValue,strSplit,iPostion);
– SELECT SUBSTRING_INDEX(‘DBA,SA,C++,JavaScript,NA,QA,Java,PHP,other,Python’,’,’,10);
– DBA,SA,C++,JavaScript,NA,QA,Java,PHP,other,

IF iPostion-1<>0 THEN
SET strValue_Old=SUBSTRING_INDEX(strValue,strSplit,iPostion-1);
SET iLength_Old=LENGTH(strValue_Old);
ELSE
SET iLength_Old=-1;
END IF;

SET iLength_New=LENGTH(strValue_New);
SET iLength=iLength_New-iLength_Old;

SET strReturn=SUBSTRING(strValue_new,iLength_Old+2,iLength);

RETURN strReturn;
END $$

DELIMITER ;
C.用於生成測試數據的存儲過程代碼
USE mysqlops;

DELIMITER $$

DROP PROCEDURE IF EXISTS usp_mysqlops_set_enum $$

CREATE PROCEDURE usp_mysqlops_set_enum(strenum_job VARCHAR(500),strset_city VARCHAR(500),idata_total INT)
BEGIN
DECLARE isplit_num TINYINT DEFAULT 0;
DECLARE idata_num INT DEFAULT 0;
DECLARE iwhile_num INT DEFAULT 0;
DECLARE icommit SMALLINT DEFAULT 0;

DECLARE irnd_f     TINYINT DEFAULT 0; 
DECLARE irnd_s     TINYINT DEFAULT 0; 
 
DECLARE strenum_job_sub VARCHAR(20) DEFAULT '';


SET isplit_num=LENGTH(strenum_job)-LENGTH(REPLACE(strenum_job,',',''));
SET idata_num=FLOOR(idata_total/isplit_num);

WHILE isplit_num<>0 
DO 
   SET strenum_job_sub=fun_split(strenum_job,',',isplit_num);
   
   WHILE iwhile_num<idata_num 
   DO
     IF icommit=0 THEN
        START TRANSACTION;
     END iF;
     
     SET irnd_f=SUBSTRING(RAND(),3,1);
     SET irnd_s=SUBSTRING(RAND(),3,1);
     
     INSERT INTO mysqlops_set_enum(Work_Option,Work_City)
     VALUES(strenum_job_sub,CONCAT(fun_split(strset_city,',',irnd_f),',',fun_split(strset_city,',',irnd_s)));
     
     IF icommit=10000 THEN
         SET icommit=0;
         COMMIT;
     END IF;
     
     SET icommit=icommit+1;
     SET iwhile_num=iwhile_num+1;
   END WHILE;
   
   SET iwhile_num=0;
   SET isplit_num=isplit_num-1;

END WHILE;

END $$
DELIMITER ;

D.生成測試數據
傳入三個收入參數:枚舉類型ENUM字段的值、集合類型SET字段的值、目標生成測試數據的總條數2000W,命令如下:

USE mysqlops;
CALL usp_mysqlops_set_enum(‘DBA,SA,C++,JavaScript,NA,QA,Java,PHP,other,Python’,‘shanghai,beijing,hangzhou,shenzhen,guangzhou,xiamen,tianjin,qingdao,dalian,xian,other’,20000000);

(三)總結
本文主要是爲接下來的二篇主題分別爲:MySQL數據庫之集合數據類型SET的DDL變更測試、MySQL數據庫之枚舉數據類型ENUM的DDL變更測試,而準備測試環境的文章信息,且這二篇文章都是用共同的測試表數據,也爲方便讀者們的理解與後續篇章的閱讀,特意單獨作爲一篇文章,本文的主要內容是MySQL函數與MySQL存儲過程,可以借鑑到的信息:
a)提供一個較通用性的字符串分拆函數,也即指定分隔符號,再傳入字符串和分拆字符的順序號,即返回想獲得的字符串數據;
b)MySQL函數的正確編寫技巧;
c)MySQL存儲過程的編寫技巧;
d)MySQL提供的語句段控制循環操作的WHILE用法;
e)MySQL函數與MySQL存儲過程內,都有各種字符串函數的調用,也請讀者學習其用法;
f)MySQL存儲過程中採用了多條語句寫入,批量提交的事務技巧,以加速InnoDB存儲引擎INSERT事務的處理速度。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章