MySQL開發(fā)規(guī)范與實用技術(shù)交流-課件_第1頁
MySQL開發(fā)規(guī)范與實用技術(shù)交流-課件_第2頁
MySQL開發(fā)規(guī)范與實用技術(shù)交流-課件_第3頁
MySQL開發(fā)規(guī)范與實用技術(shù)交流-課件_第4頁
MySQL開發(fā)規(guī)范與實用技術(shù)交流-課件_第5頁
已閱讀5頁,還剩39頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

MySQL開發(fā)規(guī)范與實用技術(shù)交流

姓名:金官丁

旺旺:Eugene198312MySQL開發(fā)規(guī)范與實用技術(shù)交流

姓名:金官丁

1

內(nèi)容 1.開發(fā)實用技術(shù) 2.MySQL開發(fā)規(guī)范 3.項目支持 4.變更管理 5.SQLREVIEW6.開發(fā)測試服務(wù)器說明 7.MySQL相關(guān)項目建議8.簡述InnoDB引擎鎖與索引 內(nèi)容21.開發(fā)實用技術(shù)

1.1自增字段定義1.2CHAR(N)或VARCHAR(N)中的N解釋1.3字符串函數(shù)1.4日期操作函數(shù)1.5類型轉(zhuǎn)換函數(shù)1.開發(fā)實用技術(shù)31.1自增字段定義

自增字段類型必須是整型,推薦類型為INT或者BIGINT類型。并且自增字段必須是主鍵或主鍵的一部分。

1.2CHAR(N)或VARCHAR(N)中的N解釋

MySQL中此兩類字符串定義時候填寫的長度N,不是字節(jié)數(shù)的意思,而是字符數(shù)的意思。我們MySQL所有數(shù)據(jù)庫的字符集都為UTF8,字符集校對規(guī)則為UTF8_general_ci。對于中文漢字,實際存儲的時候占三個字節(jié),而數(shù)據(jù)或字母,則只占一個字節(jié)。例如:CREATETABELgl_user(usernameVARCHAR(40));則username最多能存儲40個字符。1.1自增字段定義41.3字符串函數(shù)

MySQL中字符串連接方法,使用CONCAT()或CONCAT_WS()函數(shù),語法如下:CONCAT(string1,string2,...)CONCAT_WS(separator,string1,string2,..)字符串長度統(tǒng)計:LENGTH(string)#返回string所占的字節(jié)數(shù)CHAR_LENGTH(string)#返回string中的字符個數(shù)統(tǒng)計字符個數(shù),就不區(qū)分是漢字還是字母或數(shù)字,也跟字符集沒有關(guān)系,若統(tǒng)計的是字節(jié)數(shù),則由字符是漢字、字母或數(shù)字類型,以及字符集共同決定。

請各位牢記:我們所有的MySQL數(shù)據(jù)庫都將會采用UTF8編碼,所以一個漢字占3個字節(jié),一個字母或數(shù)字占一個字節(jié)。1.3字符串函數(shù)51.4日期操作函數(shù)

獲取當前時間:NOW(),CURDATE()、CURTIME()其中,NOW()函數(shù)精確到秒,格式:YYYY-MM-DDHH:MM:SSCURDATE函數(shù)精確到天,格式:YYYY-MM-DDCURTIME函數(shù)精確到秒,格式:HH:MM:SS日期數(shù)值的加減函數(shù):

DATE_ADD(date,INTERVALexpr

type)DATE_SUB(date,INTERVALexpr

type)

常用的幾種type類型:YEAR、MONTH、DAY、HOUR、MINUTE,其中expr可以為正數(shù)或負數(shù),我們在開過程中,一般使用DATE_ADD()函數(shù),若要作日期減去一個數(shù)字的方式,就使用負數(shù)。

DATEDIFF(expr1,expr2),是返回開始日期expr1與結(jié)束日期expr2之間,相差的天數(shù)

,返回值為正數(shù)或負數(shù)。返回日期某部分信息的函數(shù):YEAR(expr1)返回日期expr1部分的年份;MONTH(expr1)返回日期expr1部分的月份;DAY(expr1)返回expr1部分的天數(shù);WEEKDAY(expr1)返回expr1對應(yīng)的星期數(shù)字1.4日期操作函數(shù)61.5類型轉(zhuǎn)換函數(shù)

字符串轉(zhuǎn)換成日期方式,DATE_FORMAT()或STR_TO_DATE(),兩個函數(shù)的格式如下:DATE_FORMAT(expr1,format)STR_TO_DATE(expr1,format)常用的日期格式Y(jié)YYY-MM-DDHH:MM:SS對應(yīng)的format為%Y-%m-%d%H:%i:%S通用的類型轉(zhuǎn)換函數(shù):

CAST(exprAStype)CONVERT(expr,type)CONVERT(exprUSINGtranscoding_name)1.5類型轉(zhuǎn)換函數(shù)72.MySQL開發(fā)規(guī)范

2.1字段定義規(guī)范

2.2綁定變量和替代變量使用規(guī)范

2.3數(shù)據(jù)類型轉(zhuǎn)換規(guī)范

2.4SELECT*的使用規(guī)范

2.5字段上添加函數(shù)使用規(guī)范

2.6表連接規(guī)范

2.7分頁查詢規(guī)范

2.8特殊操作符使用規(guī)范

2.9特殊函數(shù)使用規(guī)范2.MySQL開發(fā)規(guī)范82.1字段定義規(guī)范

MySQL中用到的相關(guān)列數(shù)據(jù)類型存儲需求與范圍描述信息如下表:

列類型表達的范圍存儲需求TINYINT[(M)][UNSIGNED][ZEROFILL]-128到127或0到2551個字節(jié)SMALLINT[(M)][UNSIGNED][ZEROFILL]-32768到32767或0到655352個字節(jié)INT[(M)][UNSIGNED][ZEROFILL]-2147483648到2147483647或0到42949672954個字節(jié)BIGINT[(M)][UNSIGNED][ZEROFILL]-9223372036854775808到9223372036854775807或0到184467440737095516158個字節(jié)DECIMAL[(M[,D])][UNSIGNED][ZEROFILL]整數(shù)最大位數(shù)(M)為65,小數(shù)位數(shù)最大(D)為30變長DATEYYYY-MM-DD3個字節(jié)DATETIMEYYYY-MM-DDHH:MM:SS(1001年到9999年的范圍)8個字節(jié)TIMESTAMPYYYY-MM-DDHH:MM:SS(1970年到2037年的范圍)4個字節(jié)CHAR(M)0<M<=255(建議CHAR(1)外,超過此長度的用VARCHAR)M個字符(所占空間跟字符集等有關(guān)系)VARCHAR(M)0<M<65532/NM個字符(N大小由字符集,以及是否為中文還是字母數(shù)字等有關(guān)系)TEXT64K個字符所占空間跟字符集等有關(guān)系2.1字段定義規(guī)范列類型表達的范圍存儲需求TINYINT[9詳細說明:所有動態(tài)長度字符串全部使用VARCHAR類型,類似于狀態(tài),有限類別的字段,也使用可以比較明顯表示出實際意義的字符串,而不應(yīng)該使用INT之類的數(shù)字來代替;2.固定長度的字符串使用CHAR類型,所有單個字符的全部使用CHAR類型,

而不應(yīng)該使用VARCHAR類型;3.僅僅當字符數(shù)量可能超過20000個的時候,可以使用TEXT類型來存放字符

類數(shù)據(jù)。所有使用TEXT類型的字段必須和原表進行分拆,與原表主鍵單獨組

成另外一個表進行存放;4.需要精確到時間(年月日時分秒)的字段可以使用DATETIME或TIMESTAMP,

但請注意各自能表達的范圍,以及是否需要用到TIMESTAMP的特性;5.所有只需要精確到天的字段全部使用DATE類型,而不應(yīng)該使用TIMESTAMP

或者DATETIME類型;6.自增序列類型的字段只能使用INT或者BIGINT,且明確標識出為無符號型(UNSIGNED),除非確實會出現(xiàn)負數(shù),僅當該字段數(shù)字取值會超過42億,才使用BIGINT類型;

詳細說明:10

2.2綁定變量和替代變量使用規(guī)范基本原則:所有Query的Where條件中的變量,都需要使用綁定變量來實現(xiàn),此要求并不完全是基于性能的考慮,更多是基于安全方面的考慮,如若有任何不使用綁定變量的需求,都必須通過安全部門的審核并征得同意。詳細說明:.在iBatis的SqlMap文件中綁定變量使用“#var_name#”表示,替代變量使用$var_name$”;所有需要動態(tài)OrderBy條件的Query,在使用替代變量過程中,需要將可能傳入的內(nèi)容以枚舉類寫死在代碼中,禁止接受任何外部傳入內(nèi)容;.對于不變的常量條件,請使用常量而不是變量;.IN子句,使用"Iterate+數(shù)組類型變量"的方式實現(xiàn)綁定變量而不是通過代碼拼接Query語句,例如:<isNotEmptyprepend="and"property="userIds"><iterateproperty="userIds"open="t.user_idin("close=")"conjunction=",">#userIds[]#</iterate></isNotEmpty>iBatis會生成t.user_idin(1,2,3,4,5...)的語句2.2綁定變量和替代變量使用規(guī)范112.3數(shù)據(jù)類型轉(zhuǎn)換規(guī)范基本原則:在所有Query的Where條件中必須使用和過濾字段完全一致的數(shù)據(jù)類型,杜絕任何隱式類型轉(zhuǎn)換,避免造成因為數(shù)據(jù)類型不匹配而導(dǎo)致Query執(zhí)行計劃的出錯,造成性能問題.詳細說明:1>所有Where條件的字段上不允許使用函數(shù)做類型轉(zhuǎn)換,如有需要轉(zhuǎn)換類型,只能轉(zhuǎn)換過濾值,而不是轉(zhuǎn)換字段.2>最為常見的隱式類型轉(zhuǎn)換常見于時間類型與字符串類型之間,建議所有時間類型字段在iBatis中均以時間類型傳入,或者以字符串傳入然后通過時間函數(shù)轉(zhuǎn)換字符串為合法的時間格式,如下:SELECT*FROMmemberWHEREgmt_create=DATE_FORMATE('2009010101:02:03','%Y-%m-%d%H:%i:%s');3>在表連接Query中,如果連接條件兩端的數(shù)據(jù)類型不一致,必須保證將驅(qū)動表的連接條件數(shù)據(jù)類型轉(zhuǎn)換為與被驅(qū)動表一致的數(shù)據(jù)類型.

2.3數(shù)據(jù)類型轉(zhuǎn)換規(guī)范122.4SELECT*的使用規(guī)范基本原則:在不必要查詢中使用“*”列出所有字段,且需存在GROUPBY或ORDERBY的時候,禁止使用SELECT*一次取出所有的字段。對于表連接的JOIN語句,禁止使用SELECT*來進行查詢,除非明確獲得DBA允許。含有text字段的表,當不需要取出TEXT字段的時候,也禁止使用SELECT*進行查詢.詳細說明:1>進行GROUPBY或ORDERBY的時候不允許使用SELECT*是為了確保MySQL

能夠使用最新的優(yōu)化排序算法.2>JOIN語句不允許使用SELECT*是為了防止僅僅只需要索引即可完成的查詢需

要回表取數(shù).3>存有TEXT字段表,在不需要取出TEXT字段的時候,不允許使用SELECT*,因為

TEXT字段是存放在和普通記錄不一樣的物理位置,會造成大量的io操作.4>避免因增刪字段而沒有修改相關(guān)SQL及相關(guān)程序代碼導(dǎo)致程序BUG,而禁用SELECT*.2.4SELECT*的使用規(guī)范132.5字段上添加函數(shù)使用規(guī)范基本原則:禁止在WHERE條件中出現(xiàn)的過濾字段上,使用任何函數(shù)進行類型或格式的轉(zhuǎn)換;正確的做法是把傳入比較的值轉(zhuǎn)換為列類型所需要的。錯誤的寫法:SELECTusernameFROMgl_userWHEREDATE_FORMAT(gmt_create,'%Y%m%d%H%i%s')='20090501022300‘;正確的寫法:SELECTusernameFROMgl_userWHEREgmt_create=DATE_FORMAT('20090501022300','%Y-%m-%d%H:%i:s');2.5字段上添加函數(shù)使用規(guī)范142.6表連接規(guī)范基本原則:

所有非外連接SQL(即INNERJOIN),請把關(guān)聯(lián)表統(tǒng)一寫到FROM字句中,關(guān)聯(lián)條件與過濾條件統(tǒng)一寫到WHERE字句中.

出于代碼的可讀性原因,所有外連接SQL語句中,請一律使用LEFTJOIN,禁用RIGHTJOIN。

另外,請注意LEFTJOIN字句中,右邊位置表的條件書寫位置不同的影響:SELECTA.rolename,A.gmt_create,B.nicknameFROMgl_roleALEFTJOINgl_roledetailBONA.ID=B.roleidANDB.roleID=2;++++|rolename|gmt_create|nickname|++++|163|0000-00-0000:00:00|test2||sina|0000-00-0000:00:00|NULL||hotmail|0000-00-0000:00:00|NULL||126|2009-08-2018:20:18|NULL|++++SELECTA.rolename,A.gmt_create,B.nicknameFROMgl_roleALEFTJOINgl_roledetailBONA.ID=B.roleidWHEREB.roleID=2;++++|rolename|gmt_create|nickname|++++|163|0000-00-0000:00:00|test2|++++

2.6表連接規(guī)范152.7分頁查詢規(guī)范基本原則:分頁查詢語句全部都需要帶有排序條件,除非商業(yè)方明確要求不要使用任何排序來隨機展示數(shù)據(jù)。詳細說明:1>常規(guī)分頁語句寫法(start:起始記錄數(shù),page_offset:每頁記錄數(shù)):SELECTID,usernameFROMgl_userWHEREusernamelike'%163'ORDERBYM.gmt_createLIMITstart,page_offset;2>多表Join的分頁語句,如果過濾條件在單個表上,需要先分頁,再Join:低性能寫法:SELECTM.username,P.rolenameFROMgl_userMINNERJOINgl_rolePONM.ID=P.useridWHEREusernamelike'%163'ORDERBYM.gmt_createLIMITstart,page_offset;高性能寫法:SELECTM.username,P.rolenameFROM(SELECTID,usernameFROMgl_userWHEREusernamelike'%163'ORDERBYM.gmt_createLIMITstart,page_offset)M,gl_rolePWHEREM.ID=P.userid;這樣寫的前提是關(guān)聯(lián)的表之間記錄一一對應(yīng),否則可能會返回的記錄數(shù)目少于或多于page_offset的值。

2.7分頁查詢規(guī)范163.項目支持

3.1重設(shè)計,輕需求:從設(shè)計階段開始參與,不會過

多干涉需求

3.2針對重點部分詳細Review,非重點部分僅針對性檢查是否符合規(guī)范3.3線上的MySQL產(chǎn)品庫依然由MySQL團隊的DBA負責實施與

維護。各個站點的MySQL項目,在開發(fā)測試階段,以各個

站點的DBATeam接口人為主要負責人:

國際站DBATeam方接口人:中文站DBATeam方接口人:

CRMDBATeam方接口人:3.項目支持174.變更管理

4.1結(jié)構(gòu)變更先進入數(shù)據(jù)庫變更系統(tǒng)記,訪問地址:

dba.hz.alibaba-inc:8080/dbadmin/default.jsp

4.2有非核心小表(不超過10W條記錄)結(jié)構(gòu)變更的發(fā)布至少提前1星期通知發(fā)布具體時間,超過10w條

記錄的結(jié)構(gòu)變更必須提前2星期通知發(fā)布時間

4.3每天的09:00–12:00與14:00–16:00

之間一般不對產(chǎn)品數(shù)據(jù)庫做任何變更(備注:數(shù)據(jù)庫結(jié)

構(gòu)變更)操作4.變更管理185.SQLREVIEW每個項目都會在Confluence上創(chuàng)建相關(guān)頁面,用于提交與審核SQL。編號變化Sql語句

變化類型開發(fā)功能描述執(zhí)行頻率前臺是否cache審核審核修改意見是否修改完成(新增/修改)負責人(數(shù)量級/天)/后臺人員結(jié)果1SELECTrelation_typeFROMbrmms_contact新增090510張三通過memberId,friend_id查詢兩者關(guān)系類型100萬/天后臺否

WHEREmember_id=#memberId#ANDfriend_id=#friendId#5.SQLREVIEW編號變化Sql語句

變化類型開發(fā)功能196.開發(fā)測試服務(wù)器說明1>開發(fā)測試服務(wù)器,不保證其能做性能測試,而是大家公用.2>開發(fā)測試各有一套數(shù)據(jù)庫,開發(fā)人員庫名稱一般為項目名稱,測試人員的庫:開發(fā)庫_test3>項目開發(fā)人員帳號密碼規(guī)則:庫名稱或項目名稱或即為帳號密碼.4>測試人員帳號密碼規(guī)則:庫名稱或項目名稱或即為帳號,密碼單獨發(fā)給各個站點的接口人.5>開發(fā)測試人員的權(quán)限一般為僅有四種權(quán)限:SELECT,INSERT,UPDATE,DELETE.6>開發(fā)庫的結(jié)構(gòu)變更必須先提交到變更系統(tǒng),然后通知下DBA(目前還不能自動提醒我們)7>開發(fā)庫結(jié)構(gòu)發(fā)生變更,是否一起變更測試數(shù)據(jù)庫,需要項目中約定,目前主要采用兩種方

式:

第一種,約定測試庫等待測試人員發(fā)送變更信息(郵件,旺旺為主);

第二種,約定開發(fā)人員變動數(shù)據(jù)庫結(jié)構(gòu),同時修改測試庫;8>關(guān)于數(shù)據(jù)庫性能測試,DBA,開發(fā)人員,測試人員三方共同協(xié)調(diào)與借調(diào)短期內(nèi)專用且配置

相當?shù)男阅軠y試數(shù)據(jù)庫服務(wù)器,DBA負責搭建.6.開發(fā)測試服務(wù)器說明207.MySQL使用建議1>.進行數(shù)據(jù)庫結(jié)構(gòu)設(shè)計的時候,考慮適當?shù)娜哂?,盡量確保應(yīng)用讀寫數(shù)據(jù)的SQL簡潔.2>.所有字符集為utf8,校對規(guī)則為utf8_general_ci,默認是不區(qū)分英文字母大小寫,若有需求

區(qū)分大小寫,請跟DBA特別聲明,或者表定義語句指定COLLATE‘utf8_bin’.3>.盡量不需要使用子查詢,特別是IN的方式,可考慮轉(zhuǎn)化為EXISTS.SELECT*FROMAWHREA.ColName1IN(SELECTDISTINCTIDFROMBWHERE..);

建議改寫為:SELECT*FROMAWHREEXISTS(SELECT1FROMBWHEREB.ID=A.ColName1...);4>要返回MySQL自增序列的ID值,可以考慮使用函數(shù)LAST_INSERT_ID(),此函數(shù)只能返回同

一個SESSION最近一次對有AUTO_INCREMENT屬性表INSERT的ID值.5>所有的時間字段值,請以MySQL數(shù)據(jù)庫的時鐘為準,除用戶輸入的時間值外.6>對于項目的數(shù)據(jù)量、PV等合理評估,我們DBA

TEAM相關(guān)人員,會給大家推薦合理成熟的數(shù)

據(jù)存取架構(gòu),增強系統(tǒng)的擴展性與用戶體驗,以及高可用性等.

7.MySQL使用建議21您們的滿意也是我們的滿意;您們的成功也是我們的成功;讓我們大家攜手共創(chuàng)美好未來.謝謝各位的聆聽!MySQL開發(fā)規(guī)范與實用技術(shù)交流-課件22MySQL開發(fā)規(guī)范與實用技術(shù)交流

姓名:金官丁

旺旺:Eugene198312MySQL開發(fā)規(guī)范與實用技術(shù)交流

姓名:金官丁

23

內(nèi)容 1.開發(fā)實用技術(shù) 2.MySQL開發(fā)規(guī)范 3.項目支持 4.變更管理 5.SQLREVIEW6.開發(fā)測試服務(wù)器說明 7.MySQL相關(guān)項目建議8.簡述InnoDB引擎鎖與索引 內(nèi)容241.開發(fā)實用技術(shù)

1.1自增字段定義1.2CHAR(N)或VARCHAR(N)中的N解釋1.3字符串函數(shù)1.4日期操作函數(shù)1.5類型轉(zhuǎn)換函數(shù)1.開發(fā)實用技術(shù)251.1自增字段定義

自增字段類型必須是整型,推薦類型為INT或者BIGINT類型。并且自增字段必須是主鍵或主鍵的一部分。

1.2CHAR(N)或VARCHAR(N)中的N解釋

MySQL中此兩類字符串定義時候填寫的長度N,不是字節(jié)數(shù)的意思,而是字符數(shù)的意思。我們MySQL所有數(shù)據(jù)庫的字符集都為UTF8,字符集校對規(guī)則為UTF8_general_ci。對于中文漢字,實際存儲的時候占三個字節(jié),而數(shù)據(jù)或字母,則只占一個字節(jié)。例如:CREATETABELgl_user(usernameVARCHAR(40));則username最多能存儲40個字符。1.1自增字段定義261.3字符串函數(shù)

MySQL中字符串連接方法,使用CONCAT()或CONCAT_WS()函數(shù),語法如下:CONCAT(string1,string2,...)CONCAT_WS(separator,string1,string2,..)字符串長度統(tǒng)計:LENGTH(string)#返回string所占的字節(jié)數(shù)CHAR_LENGTH(string)#返回string中的字符個數(shù)統(tǒng)計字符個數(shù),就不區(qū)分是漢字還是字母或數(shù)字,也跟字符集沒有關(guān)系,若統(tǒng)計的是字節(jié)數(shù),則由字符是漢字、字母或數(shù)字類型,以及字符集共同決定。

請各位牢記:我們所有的MySQL數(shù)據(jù)庫都將會采用UTF8編碼,所以一個漢字占3個字節(jié),一個字母或數(shù)字占一個字節(jié)。1.3字符串函數(shù)271.4日期操作函數(shù)

獲取當前時間:NOW(),CURDATE()、CURTIME()其中,NOW()函數(shù)精確到秒,格式:YYYY-MM-DDHH:MM:SSCURDATE函數(shù)精確到天,格式:YYYY-MM-DDCURTIME函數(shù)精確到秒,格式:HH:MM:SS日期數(shù)值的加減函數(shù):

DATE_ADD(date,INTERVALexpr

type)DATE_SUB(date,INTERVALexpr

type)

常用的幾種type類型:YEAR、MONTH、DAY、HOUR、MINUTE,其中expr可以為正數(shù)或負數(shù),我們在開過程中,一般使用DATE_ADD()函數(shù),若要作日期減去一個數(shù)字的方式,就使用負數(shù)。

DATEDIFF(expr1,expr2),是返回開始日期expr1與結(jié)束日期expr2之間,相差的天數(shù)

,返回值為正數(shù)或負數(shù)。返回日期某部分信息的函數(shù):YEAR(expr1)返回日期expr1部分的年份;MONTH(expr1)返回日期expr1部分的月份;DAY(expr1)返回expr1部分的天數(shù);WEEKDAY(expr1)返回expr1對應(yīng)的星期數(shù)字1.4日期操作函數(shù)281.5類型轉(zhuǎn)換函數(shù)

字符串轉(zhuǎn)換成日期方式,DATE_FORMAT()或STR_TO_DATE(),兩個函數(shù)的格式如下:DATE_FORMAT(expr1,format)STR_TO_DATE(expr1,format)常用的日期格式Y(jié)YYY-MM-DDHH:MM:SS對應(yīng)的format為%Y-%m-%d%H:%i:%S通用的類型轉(zhuǎn)換函數(shù):

CAST(exprAStype)CONVERT(expr,type)CONVERT(exprUSINGtranscoding_name)1.5類型轉(zhuǎn)換函數(shù)292.MySQL開發(fā)規(guī)范

2.1字段定義規(guī)范

2.2綁定變量和替代變量使用規(guī)范

2.3數(shù)據(jù)類型轉(zhuǎn)換規(guī)范

2.4SELECT*的使用規(guī)范

2.5字段上添加函數(shù)使用規(guī)范

2.6表連接規(guī)范

2.7分頁查詢規(guī)范

2.8特殊操作符使用規(guī)范

2.9特殊函數(shù)使用規(guī)范2.MySQL開發(fā)規(guī)范302.1字段定義規(guī)范

MySQL中用到的相關(guān)列數(shù)據(jù)類型存儲需求與范圍描述信息如下表:

列類型表達的范圍存儲需求TINYINT[(M)][UNSIGNED][ZEROFILL]-128到127或0到2551個字節(jié)SMALLINT[(M)][UNSIGNED][ZEROFILL]-32768到32767或0到655352個字節(jié)INT[(M)][UNSIGNED][ZEROFILL]-2147483648到2147483647或0到42949672954個字節(jié)BIGINT[(M)][UNSIGNED][ZEROFILL]-9223372036854775808到9223372036854775807或0到184467440737095516158個字節(jié)DECIMAL[(M[,D])][UNSIGNED][ZEROFILL]整數(shù)最大位數(shù)(M)為65,小數(shù)位數(shù)最大(D)為30變長DATEYYYY-MM-DD3個字節(jié)DATETIMEYYYY-MM-DDHH:MM:SS(1001年到9999年的范圍)8個字節(jié)TIMESTAMPYYYY-MM-DDHH:MM:SS(1970年到2037年的范圍)4個字節(jié)CHAR(M)0<M<=255(建議CHAR(1)外,超過此長度的用VARCHAR)M個字符(所占空間跟字符集等有關(guān)系)VARCHAR(M)0<M<65532/NM個字符(N大小由字符集,以及是否為中文還是字母數(shù)字等有關(guān)系)TEXT64K個字符所占空間跟字符集等有關(guān)系2.1字段定義規(guī)范列類型表達的范圍存儲需求TINYINT[31詳細說明:所有動態(tài)長度字符串全部使用VARCHAR類型,類似于狀態(tài),有限類別的字段,也使用可以比較明顯表示出實際意義的字符串,而不應(yīng)該使用INT之類的數(shù)字來代替;2.固定長度的字符串使用CHAR類型,所有單個字符的全部使用CHAR類型,

而不應(yīng)該使用VARCHAR類型;3.僅僅當字符數(shù)量可能超過20000個的時候,可以使用TEXT類型來存放字符

類數(shù)據(jù)。所有使用TEXT類型的字段必須和原表進行分拆,與原表主鍵單獨組

成另外一個表進行存放;4.需要精確到時間(年月日時分秒)的字段可以使用DATETIME或TIMESTAMP,

但請注意各自能表達的范圍,以及是否需要用到TIMESTAMP的特性;5.所有只需要精確到天的字段全部使用DATE類型,而不應(yīng)該使用TIMESTAMP

或者DATETIME類型;6.自增序列類型的字段只能使用INT或者BIGINT,且明確標識出為無符號型(UNSIGNED),除非確實會出現(xiàn)負數(shù),僅當該字段數(shù)字取值會超過42億,才使用BIGINT類型;

詳細說明:32

2.2綁定變量和替代變量使用規(guī)范基本原則:所有Query的Where條件中的變量,都需要使用綁定變量來實現(xiàn),此要求并不完全是基于性能的考慮,更多是基于安全方面的考慮,如若有任何不使用綁定變量的需求,都必須通過安全部門的審核并征得同意。詳細說明:.在iBatis的SqlMap文件中綁定變量使用“#var_name#”表示,替代變量使用$var_name$”;所有需要動態(tài)OrderBy條件的Query,在使用替代變量過程中,需要將可能傳入的內(nèi)容以枚舉類寫死在代碼中,禁止接受任何外部傳入內(nèi)容;.對于不變的常量條件,請使用常量而不是變量;.IN子句,使用"Iterate+數(shù)組類型變量"的方式實現(xiàn)綁定變量而不是通過代碼拼接Query語句,例如:<isNotEmptyprepend="and"property="userIds"><iterateproperty="userIds"open="t.user_idin("close=")"conjunction=",">#userIds[]#</iterate></isNotEmpty>iBatis會生成t.user_idin(1,2,3,4,5...)的語句2.2綁定變量和替代變量使用規(guī)范332.3數(shù)據(jù)類型轉(zhuǎn)換規(guī)范基本原則:在所有Query的Where條件中必須使用和過濾字段完全一致的數(shù)據(jù)類型,杜絕任何隱式類型轉(zhuǎn)換,避免造成因為數(shù)據(jù)類型不匹配而導(dǎo)致Query執(zhí)行計劃的出錯,造成性能問題.詳細說明:1>所有Where條件的字段上不允許使用函數(shù)做類型轉(zhuǎn)換,如有需要轉(zhuǎn)換類型,只能轉(zhuǎn)換過濾值,而不是轉(zhuǎn)換字段.2>最為常見的隱式類型轉(zhuǎn)換常見于時間類型與字符串類型之間,建議所有時間類型字段在iBatis中均以時間類型傳入,或者以字符串傳入然后通過時間函數(shù)轉(zhuǎn)換字符串為合法的時間格式,如下:SELECT*FROMmemberWHEREgmt_create=DATE_FORMATE('2009010101:02:03','%Y-%m-%d%H:%i:%s');3>在表連接Query中,如果連接條件兩端的數(shù)據(jù)類型不一致,必須保證將驅(qū)動表的連接條件數(shù)據(jù)類型轉(zhuǎn)換為與被驅(qū)動表一致的數(shù)據(jù)類型.

2.3數(shù)據(jù)類型轉(zhuǎn)換規(guī)范342.4SELECT*的使用規(guī)范基本原則:在不必要查詢中使用“*”列出所有字段,且需存在GROUPBY或ORDERBY的時候,禁止使用SELECT*一次取出所有的字段。對于表連接的JOIN語句,禁止使用SELECT*來進行查詢,除非明確獲得DBA允許。含有text字段的表,當不需要取出TEXT字段的時候,也禁止使用SELECT*進行查詢.詳細說明:1>進行GROUPBY或ORDERBY的時候不允許使用SELECT*是為了確保MySQL

能夠使用最新的優(yōu)化排序算法.2>JOIN語句不允許使用SELECT*是為了防止僅僅只需要索引即可完成的查詢需

要回表取數(shù).3>存有TEXT字段表,在不需要取出TEXT字段的時候,不允許使用SELECT*,因為

TEXT字段是存放在和普通記錄不一樣的物理位置,會造成大量的io操作.4>避免因增刪字段而沒有修改相關(guān)SQL及相關(guān)程序代碼導(dǎo)致程序BUG,而禁用SELECT*.2.4SELECT*的使用規(guī)范352.5字段上添加函數(shù)使用規(guī)范基本原則:禁止在WHERE條件中出現(xiàn)的過濾字段上,使用任何函數(shù)進行類型或格式的轉(zhuǎn)換;正確的做法是把傳入比較的值轉(zhuǎn)換為列類型所需要的。錯誤的寫法:SELECTusernameFROMgl_userWHEREDATE_FORMAT(gmt_create,'%Y%m%d%H%i%s')='20090501022300‘;正確的寫法:SELECTusernameFROMgl_userWHEREgmt_create=DATE_FORMAT('20090501022300','%Y-%m-%d%H:%i:s');2.5字段上添加函數(shù)使用規(guī)范362.6表連接規(guī)范基本原則:

所有非外連接SQL(即INNERJOIN),請把關(guān)聯(lián)表統(tǒng)一寫到FROM字句中,關(guān)聯(lián)條件與過濾條件統(tǒng)一寫到WHERE字句中.

出于代碼的可讀性原因,所有外連接SQL語句中,請一律使用LEFTJOIN,禁用RIGHTJOIN。

另外,請注意LEFTJOIN字句中,右邊位置表的條件書寫位置不同的影響:SELECTA.rolename,A.gmt_create,B.nicknameFROMgl_roleALEFTJOINgl_roledetailBONA.ID=B.roleidANDB.roleID=2;++++|rolename|gmt_create|nickname|++++|163|0000-00-0000:00:00|test2||sina|0000-00-0000:00:00|NULL||hotmail|0000-00-0000:00:00|NULL||126|2009-08-2018:20:18|NULL|++++SELECTA.rolename,A.gmt_create,B.nicknameFROMgl_roleALEFTJOINgl_roledetailBONA.ID=B.roleidWHEREB.roleID=2;++++|rolename|gmt_create|nickname|++++|163|0000-00-0000:00:00|test2|++++

2.6表連接規(guī)范372.7分頁查詢規(guī)范基本原則:分頁查詢語句全部都需要帶有排序條件,除非商業(yè)方明確要求不要使用任何排序來隨機展示數(shù)據(jù)。詳細說明:1>常規(guī)分頁語句寫法(start:起始記錄數(shù),page_offset:每頁記錄數(shù)):SELECTID,usernameFROMgl_userWHEREusernamelike'%163'ORDERBYM.gmt_createLIMITstart,page_offset;2>多表Join的分頁語句,如果過濾條件在單個表上,需要先分頁,再Join:低性能寫法:SELECTM.username,P.rolenameFROMgl_userMINNERJOINgl_rolePONM.ID=P.useridWHEREusernamelike'%163'ORDERBYM.gmt_createLIMITstart,page_offset;高性能寫法:SELECTM.username,P.rolenameFROM(SELECTID,usernameFROMgl_userWHEREusernamelike'%163'ORDERBYM.gmt_createLIMITstart,page_offset)M,gl_rolePWHEREM.ID=P.userid;這樣寫的前提是關(guān)聯(lián)的表之間記錄一一對應(yīng),否則可能會返回的記錄數(shù)目少于或多于page_offset的值。

2.7分頁查詢規(guī)范383.項目支持

3.1重設(shè)計,輕需求:從設(shè)計階段開始參與,不會過

多干涉需求

3.2針對重點部分詳細Review,非重點部分僅針對性檢查是否符合規(guī)范3.3線上的MySQL產(chǎn)品庫依然由MySQL團隊的DBA負責實施與

維護。各個站點的MySQL項目,在開發(fā)測試階段,以各個

站點的DBATeam接口人為主要負責人:

國際站DBATeam方接口人:中文站DBATeam方接口人:

CRMDBATeam方接口人:3.項目支持394.變更管理

4.1結(jié)構(gòu)變更先進入數(shù)據(jù)庫變更系統(tǒng)記,訪問地址:

dba.hz.alibaba-inc:8080/dbadmin/

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論