日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

怎么才能很好地避免低級(jí)故障?以下規(guī)范在大型互聯(lián)網(wǎng)公司經(jīng)過了充分驗(yàn)證,尤其適用于并發(fā)量大、數(shù)據(jù)量大的業(yè)務(wù)場景。

在設(shè)計(jì)數(shù)據(jù)庫技術(shù)方案時(shí),我們是有自己的設(shè)計(jì)理念或者原則,還是更多依據(jù)直覺去設(shè)計(jì)?是否曾經(jīng)懊悔線上發(fā)生過的一次低級(jí)故障?是否思考過怎樣才能避免?設(shè)計(jì)規(guī)范的價(jià)值在于提供了一份工作檢查清單,我們不斷從錯(cuò)誤中積累有效經(jīng)驗(yàn),指導(dǎo)未來的工作。

以下規(guī)范在大型互聯(lián)網(wǎng)公司經(jīng)過了充分的驗(yàn)證,尤其適用于并發(fā)量大、數(shù)據(jù)量大的業(yè)務(wù)場景。安全無小事,很多公司都曾經(jīng)因?yàn)閿?shù)據(jù)泄露導(dǎo)致用戶損失慘痛,所以將安全規(guī)范放到了第一位。?

一、安全規(guī)范

1.【強(qiáng)制】禁止在數(shù)據(jù)庫中存儲(chǔ)明文密碼,需把密碼加密后存儲(chǔ)。

說明:對(duì)于加密操作建議由公司的中間件團(tuán)隊(duì)基于如MyBatis的擴(kuò)展,提供統(tǒng)一的加密算法及密鑰管理,避免每個(gè)業(yè)務(wù)線單獨(dú)開發(fā)一套,同時(shí)也與具體的業(yè)務(wù)進(jìn)行了解耦。

2.【強(qiáng)制】禁止在數(shù)據(jù)庫中明文存儲(chǔ)用戶敏感信息,如手機(jī)號(hào)等。

說明:對(duì)于手機(jī)號(hào)建議公司搭建統(tǒng)一的手機(jī)號(hào)查詢服務(wù),避免在每個(gè)業(yè)務(wù)線單獨(dú)存儲(chǔ)。

3.【強(qiáng)制】禁止開發(fā)直接給業(yè)務(wù)同學(xué)導(dǎo)出或者查詢涉及到用戶敏感信息的數(shù)據(jù),如需要需上級(jí)領(lǐng)導(dǎo)審批。

4.【強(qiáng)制】涉及到導(dǎo)出數(shù)據(jù)功能的操作,如包含敏感字段都需加密或脫敏。

5.【強(qiáng)制】跟數(shù)據(jù)庫交互涉及的敏感數(shù)據(jù)操作都需有審計(jì)日志,必要時(shí)要做告警。

6.【強(qiáng)制】對(duì)連接數(shù)據(jù)庫的IP需設(shè)置白名單功能,杜絕非法IP接入。

7.【強(qiáng)制】對(duì)重要sql(如訂單信息的查詢)的訪問頻率或次數(shù)要做歷史趨勢監(jiān)控,及時(shí)發(fā)現(xiàn)異常行為。

8.【推薦】線上連接數(shù)據(jù)庫的用戶名、密碼建議定期進(jìn)行更換。

二、基礎(chǔ)規(guī)范

1.【推薦】盡量不在數(shù)據(jù)庫做運(yùn)算,復(fù)雜運(yùn)算需移到業(yè)務(wù)應(yīng)用里完成。

2.【推薦】拒絕大sql語句、拒絕大事務(wù)、拒絕大批量,可轉(zhuǎn)化到業(yè)務(wù)端完成。

說明:大批量操作可能會(huì)造成嚴(yán)重的主從延遲,binlog日志為row格式會(huì)產(chǎn)生大量的日志。

3.【推薦】避免使用存儲(chǔ)過程、觸發(fā)器、函數(shù)等,容易造成業(yè)務(wù)邏輯與DB耦合。

說明:數(shù)據(jù)庫擅長存儲(chǔ)與索引、要解放數(shù)據(jù)庫CPU,將計(jì)算轉(zhuǎn)移到服務(wù)層、也具備更好的擴(kuò)展性。

4.【強(qiáng)制】數(shù)據(jù)表、數(shù)據(jù)字段必須加入中文注釋。

說明:后續(xù)維護(hù)的同學(xué)看到后才清楚表是干什么用的。

5.【強(qiáng)制】不在數(shù)據(jù)庫中存儲(chǔ)圖片、文件等大數(shù)據(jù)。

說明:大文件和圖片需要儲(chǔ)在文件系統(tǒng)。

6.【推薦】對(duì)于程序連接數(shù)據(jù)庫賬號(hào),遵循權(quán)限最小原則。

7.【推薦】數(shù)據(jù)庫設(shè)計(jì)時(shí),需要問下自己是否對(duì)以后的擴(kuò)展性進(jìn)行了考慮。

8.【推薦】利用 pt-query-digest 定期分析slow query log并進(jìn)行優(yōu)化。

9.【推薦】使用內(nèi)網(wǎng)域名而不是ip連接數(shù)據(jù)庫。

10.【推薦】如果數(shù)據(jù)量或數(shù)據(jù)增長在前期規(guī)劃時(shí)就較大,那么在設(shè)計(jì)評(píng)審時(shí)就應(yīng)加入分表策略。

11.【推薦】要求所有研發(fā)SQL關(guān)鍵字全部是小寫,每個(gè)詞只允許有一個(gè)空格?

三、命名規(guī)范

1.【強(qiáng)制】庫名、表名、字段名要小寫,下劃線風(fēng)格,不超過32個(gè)字符,必須見名知意,建議使用名詞而不是動(dòng)詞,詞義與業(yè)務(wù)、產(chǎn)品線等相關(guān)聯(lián),禁止拼音英文混用。

2.【強(qiáng)制】普通索引命名格式:idx_表名_索引字段名(如果以首個(gè)字段名為索引有多個(gè),可以加上第二個(gè)字段名,太長可以考慮縮寫),唯一索引命名格式:uk_表名_索引字段名(索引名必須全部小寫,長度太長可以利用縮寫),主鍵索引命名:pk_ 字段名。

3.【強(qiáng)制】庫名、表名、字段名禁止使用MySQL保留字。

4.【強(qiáng)制】臨時(shí)庫表名必須以tmp為前綴,并以日期為后綴。

5.【強(qiáng)制】備份庫表必須以bak為前綴,并以日期為后綴。

6.【推薦】用HASH進(jìn)行散表,表名后綴使用16進(jìn)制數(shù),下標(biāo)從0開始。

7.【推薦】按日期時(shí)間分表需符合YYYY[MM][DD][HH]格式。

8.【推薦】散表如果使用md5(或者類似的hash算法)進(jìn)行散表,表名后綴使用16進(jìn)制,比如user_ff。

9.【推薦】使用CRC32求余(或者類似的算術(shù)算法)進(jìn)行散表,表名后綴使用數(shù)字,數(shù)字必須從0開始并等寬,比如散100張表,后綴從00-99。

10.【推薦】使用時(shí)間散表,表名后綴必須使用特定格式,比如按日散表user_20110209、按月散表user_201102。

11.【強(qiáng)制】表達(dá)是與否概念的字段,使用 is _ xxx 的方式進(jìn)行命名?。

四、庫設(shè)計(jì)規(guī)范

1.【推薦】數(shù)據(jù)庫使用InnoDB存儲(chǔ)引擎。

說明:支持事務(wù)、行級(jí)鎖、并發(fā)性能更好、CPU及內(nèi)存緩存頁優(yōu)化使得資源利用率更高。

2.【推薦】數(shù)據(jù)庫和表的字符集統(tǒng)一使用UTF8。

說明:utf8號(hào)稱萬國碼,其無需轉(zhuǎn)碼、無亂碼風(fēng)險(xiǎn)且節(jié)省空間。若是有字段需要存儲(chǔ)emoji表情之類的,則將表或字段設(shè)置成utf8mb4,utf8mb4向下兼容utf8。

3.【推薦】不同業(yè)務(wù),使用不同的數(shù)據(jù)庫,避免互相影響。

4.【強(qiáng)制】所有線上業(yè)務(wù)庫均必須搭建MHA高可用架構(gòu),避免單點(diǎn)問題。

五、表設(shè)計(jì)規(guī)范

1.【推薦】建表規(guī)范示例:

CREATE TABLE `student_info` (

`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵',

`stu_name` varchar(10) NOT NULL DEFAULT '' COMMENT '姓名',

`stu_score` smallint(5) unsigned NOT NULL DEFAULT '0' COMMENT '總分',

`stu_num` int(11) NOT NULL COMMENT '學(xué)號(hào)',

`gmt_create` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '創(chuàng)建時(shí)間',

`gmt_modified` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新時(shí)間',

`status` tinyint(4) DEFAULT '1' COMMENT '1代表記錄有效,0代表記錄無效',

PRIMARY KEY (`id`),

UNIQUE KEY `uk_student_info_stu_num` (`stu_num`) USING BTREE,

KEY `idx_student_info_stu_name` (`stu_name`) USING BTREE

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='學(xué)生信息表';?

2.【強(qiáng)制】禁止使用外鍵,如果有外鍵完整性約束,需要應(yīng)用程序控制。

3.【強(qiáng)制】每個(gè)Innodb 表必須有一個(gè)主鍵。

說明:Innodb 是一種索引組織表,其數(shù)據(jù)存儲(chǔ)的邏輯順序和索引的順序是相同的。每張表可以有多個(gè)索引,但表的存儲(chǔ)順序只能有一種,Innodb 是按照主鍵索引的順序來組織表的,因此不要使用更新頻繁的列如UUID、MD5、HASH和字符串列作為主鍵,這些列無法保證數(shù)據(jù)的順序增長,主鍵建議使用自增ID 值。

4.【推薦】單表列數(shù)目最好小于50。

5.【強(qiáng)制】禁止使用分區(qū)表。

說明:分區(qū)表在物理上表現(xiàn)為多個(gè)文件,在邏輯上表現(xiàn)為一個(gè)表,謹(jǐn)慎選擇分區(qū)鍵,跨分區(qū)查詢效率可能更低,建議采用物理分表的方式管理大數(shù)據(jù)。

6.【推薦】拆分大字段和訪問頻率低的字段,分離冷熱數(shù)據(jù)。

7.【推薦】采用合適的分庫分表策略,例如千庫十表、十庫百表等(建議表大小控制在2G)。

8.【推薦】單表不超過50個(gè)int字段;不超過20個(gè)char字段,不超過2個(gè)text字段。

9.【推薦】表默認(rèn)設(shè)置創(chuàng)建時(shí)間戳和更改時(shí)間戳字段。

10.【推薦】日志類型的表可以考慮按創(chuàng)建時(shí)間水平切割,定期歸檔歷史數(shù)據(jù)。

11.【強(qiáng)制】禁止使用order by rand()。

說明:order by rand()會(huì)為表增加一個(gè)偽列,然后用rand()函數(shù)為每一行數(shù)據(jù)計(jì)算出rand()值,基于該行排序,這通常都會(huì)生成磁盤上的臨時(shí)表,因此效率非常低。

12.【參考】可以結(jié)合使用hash、range、lookup table進(jìn)行散表。

13.【推薦】每張表數(shù)據(jù)量建議控制在500w以下,超過500w可以使用歷史數(shù)據(jù)歸檔或分庫分表來實(shí)現(xiàn)(500萬行并不是MySQL數(shù)據(jù)庫的限制。過大對(duì)于修改表結(jié)構(gòu),備份,恢復(fù)都會(huì)有很大問題。MySQL沒有對(duì)存儲(chǔ)有限制,取決于存儲(chǔ)設(shè)置和文件系統(tǒng))。

14.【強(qiáng)制】禁止在表中建立預(yù)留字段。

說明:預(yù)留字段的命名很難做到見名識(shí)義,預(yù)留字段無法確認(rèn)存儲(chǔ)的數(shù)據(jù)類型,所以無法選擇合適的類型;對(duì)預(yù)留字段類型的修改,會(huì)對(duì)表進(jìn)行鎖定。

六、字段設(shè)計(jì)規(guī)范

1.【強(qiáng)制】必須把字段定義為NOT NULL并且提供默認(rèn)值。

說明:NULL字段很難查詢優(yōu)化,NULL字段的索引需要額外空間,NULL字段的復(fù)合索引無效。

2.【強(qiáng)制】禁止使用ENUM,可使用TINYINT代替。

3.【強(qiáng)制】禁止使用TEXT、BLOB類型(如果表的記錄數(shù)在萬級(jí)以下可以考慮)。

4.【強(qiáng)制】必須使用varchar(20)存儲(chǔ)手機(jī)號(hào)。

5.【強(qiáng)制】禁止使用小數(shù)存儲(chǔ)國幣、使用“分”作為單位,這樣數(shù)據(jù)庫里就是整數(shù)了。

6.【強(qiáng)制】用DECIMAL代替FLOAT和DOUBLE存儲(chǔ)精確浮點(diǎn)數(shù)。

7.【推薦】使用UNSIGNED存儲(chǔ)非負(fù)整數(shù)。

說明:同樣的字節(jié)數(shù),存儲(chǔ)的數(shù)值范圍更大。

8.【推薦】建議使用INT UNSIGNED存儲(chǔ)IPV4。

說明:用UNSINGED INT存儲(chǔ)IP地址占用4字節(jié),CHAR(15)則占用15字節(jié)。另外,計(jì)算機(jī)處理整數(shù)類型比字符串類型快。使用INT UNSIGNED而不是CHAR(15)來存儲(chǔ)IPV4地址,通過MySQL函數(shù).NET_ntoa和inet_aton來進(jìn)行轉(zhuǎn)化。IPv6地址目前沒有轉(zhuǎn)化函數(shù),需要使用DECIMAL或兩個(gè)BIGINT來存儲(chǔ)。例如:

SELECT INET_ATON('192.168.172.3'); 3232279555 SELECT INET_NTOA(3232279555); 192.168.172.3

9.【推薦】字段長度盡量按實(shí)際需要進(jìn)行分配,不要隨意分配一個(gè)很大的容量。

10.【推薦】核心表字段數(shù)量盡可能地少,有大字段要考慮拆分。

11.【推薦】適當(dāng)考慮一些反范式的表設(shè)計(jì),增加冗余字段,減少JOIN。

12.【推薦】資金字段考慮統(tǒng)一*100處理成整型,避免使用decimal浮點(diǎn)類型存儲(chǔ)。

13.【推薦】使用VARBINARY存儲(chǔ)大小寫敏感的變長字符串或二進(jìn)制內(nèi)容。

說明:VARBINARY默認(rèn)區(qū)分大小寫,沒有字符集概念,速度快。

14.【參考】INT類型固定占用4字節(jié)存儲(chǔ)。

說明:INT(4)僅代表顯示字符寬度為4位,不代表存儲(chǔ)長度。數(shù)值類型括號(hào)后面的數(shù)字只是表示寬度而跟存儲(chǔ)范圍沒有關(guān)系,比如INT(3)默認(rèn)顯示3位,空格補(bǔ)齊,超出時(shí)正常顯示,Python/ target=_blank class=infotextkey>Python、JAVA客戶端等不具備這個(gè)功能。

15.【參考】區(qū)分使用DATETIME和TIMESTAMP。

說明:存儲(chǔ)年使用YEAR類型、存儲(chǔ)日期使用DATE類型、存儲(chǔ)時(shí)間(精確到秒)建議使用TIMESTAMP類型。

DATETIME和TIMESTAMP都是精確到秒,優(yōu)先選擇TIMESTAMP,因?yàn)門IMESTAMP只有4個(gè)字節(jié),而DATETIME8個(gè)字節(jié),同時(shí)TIMESTAMP具有自動(dòng)賦值以及?自動(dòng)更新的特性。

補(bǔ)充:如何使用TIMESTAMP的自動(dòng)賦值屬性?

自動(dòng)初始化,而且自動(dòng)更新:column1 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATECURRENT_TIMESTAMP 只是自動(dòng)初始化:column1 TIMESTAMP DEFAULT CURRENT_TIMESTAMP 自動(dòng)更新,初始化的值為0:column1 TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP 初始化的值為0:column1 TIMESTAMP DEFAULT 0

16.【推薦】將大字段、訪問頻率低的字段拆分到單獨(dú)的表中存儲(chǔ),分離冷熱數(shù)據(jù)。

說明:有利于有效利用緩存,防?讀入無用的冷數(shù)據(jù),較少磁盤IO,同時(shí)保證熱數(shù)據(jù)常駐內(nèi)存提?高緩存命中率。

17.【參考】VARCHAR(N),N表示的是字符數(shù)不是字節(jié)數(shù),比如VARCHAR(255),可以最大可存儲(chǔ)255個(gè)漢字,需要根據(jù)實(shí)際的寬度來選擇N。

18.【參考】VARCHAR(N),N盡可能小,因?yàn)镸ySQL一個(gè)表中所有的VARCHAR字段最大長度是65535個(gè)字節(jié),進(jìn)行排序和創(chuàng)建臨時(shí)表一類的內(nèi)存操作時(shí),會(huì)使用N的長度申請(qǐng)內(nèi)存。

19.【推薦】VARCHAR(N),N>5000時(shí),使用BLOB類型。

20.【推薦】使用短數(shù)據(jù)類型,比如取值范圍為0~80時(shí),使用TINYINT UNSIGNED。

21.【強(qiáng)制】存儲(chǔ)狀態(tài),性別等,用TINYINT。

22.【強(qiáng)制】所有存儲(chǔ)相同數(shù)據(jù)的列名和列類型必須一致(在多個(gè)表中的字段如user_id,它們類型必須一致)。

23.【推薦】優(yōu)先選擇符合存儲(chǔ)需要的最小數(shù)據(jù)類型。

24.【推薦】如果存儲(chǔ)的字符串長度幾乎相等,使用 char 定長字符串類型。

七、索引設(shè)計(jì)規(guī)范

1.【推薦】單表索引建議控制在5個(gè)以內(nèi)。

說明:索引可以增加查詢效率,但同樣也會(huì)降低插入和更新的效率,甚至有些情況下會(huì)降低查詢效率,所以不是越多越好。

2.【強(qiáng)制】禁止在更新十分頻繁,區(qū)分度不高的屬性上建立索引。

3.【強(qiáng)制】建立組合索引必須把區(qū)分度高的字段放在前面。

4.【推薦】對(duì)字符串使用索引,如果字符串定義長度超過128的,可以考慮前綴索引。

5.【強(qiáng)制】表必須有主鍵,并且是auto_increment及not null的,根據(jù)表的實(shí)際情況定義無符號(hào)的tinyint,smallint,int,bigint。

6.【強(qiáng)制】禁止更新頻繁的列作為主鍵。

7.【強(qiáng)制】禁止字符串列作為主鍵。

8.【強(qiáng)制】禁止UUID MD5 HASH這些作為主鍵(數(shù)值太離散了)。

9.【推薦】默認(rèn)使用非空的唯一鍵作為主鍵。

10.【推薦】主鍵建議選擇自增或發(fā)號(hào)器。

11.【推薦】核心SQL優(yōu)先考慮覆蓋索引。

12.【參考】避免冗余和重復(fù)索引。

13.【參考】索引要綜合評(píng)估數(shù)據(jù)密度和分布以及考慮查詢和更新比例。

14.【強(qiáng)制】不在索引列進(jìn)行數(shù)學(xué)運(yùn)算和函數(shù)運(yùn)算。

15.【推薦】研發(fā)要經(jīng)常使用explAIn,如果發(fā)現(xiàn)索引選擇性差,必須要學(xué)會(huì)使用hint。

16.【推薦】能使用唯一索引就要使用唯一索引,提高查詢效率。

17.【推薦】多條字段重復(fù)的語句,要修改語句條件字段的順序,為其建立一條聯(lián)合索引,減少索引數(shù)量。

18.【強(qiáng)制】索引字段要保證不為NULL,考慮default value進(jìn)去。NULL也是占空間,而且NULL非常影響索引的查詢效率。

19.【強(qiáng)制】新建的唯一索引不能和主鍵重復(fù)。

20.【推薦】盡量不使用外鍵、外鍵用來保護(hù)參照完整性,可在業(yè)務(wù)端實(shí)現(xiàn)。

說明:避免對(duì)父表和子表的操作會(huì)相互影響,降低可用性。

21.【強(qiáng)制】字符串不應(yīng)做主鍵。

22.【強(qiáng)制】表必須有無符號(hào)int型自增主鍵,對(duì)應(yīng)表中id字段。

說明:必須得有主鍵的原因:采用RBR模式復(fù)制,無主鍵的表刪除,會(huì)導(dǎo)致備庫夯住 ;使用自增的原因:數(shù)據(jù)寫入可以提高插入性能,避免page分裂,減少表碎片。

23.【推薦】對(duì)長度過長的VARCHAR字段建立索引時(shí),添加crc32或者M(jìn)D5 Hash字段,對(duì)Hash字段建立索引。

說明:下面的表增加一列url_crc32,然后對(duì)url_crc32建立索引,減少索引字段的長度,提高效率。

CREATE TABLE url( ... url VARCHAR(255) NOT NULL DEFAULT 0, url_crc32 INT UNSIGNED NOT NULL DEFAULT 0, ... index idx_url(url_crc32) )

24.【推薦】WHERE條件中的非等值條件(IN、BETWEEN、<、<=、>、>=)會(huì)導(dǎo)致后面的條件使用不了索引。

25.【推薦】索引字段的順序需要考慮字段值去重之后的個(gè)數(shù),個(gè)數(shù)多的放在前面。

26.【推薦】ORDER BY,GROUP BY,DISTINCT的字段需要添加在索引的后面。

27.【參考】合理創(chuàng)建聯(lián)合索引(避免冗余),如(a,b,c) 相當(dāng)于 (a) 、(a,b) 、(a,b,c)。

28.【推薦】復(fù)合索引中的字段數(shù)建議不超過5個(gè)。

29.【強(qiáng)制】不在選擇性低的列上建立索引,例如"性別", "狀態(tài)", "類型"。

30.【推薦】對(duì)于單獨(dú)條件如果走不了索引,可以使用force –index強(qiáng)制指定索引。

31.【強(qiáng)制】禁止給表中的每一列都建立單獨(dú)的索引。

32.【推薦】在varchar字段上建立索引時(shí),必須指定索引長度,沒必要對(duì)全字段建立索引,根據(jù)實(shí)際文本區(qū)分度決定索引長度即可?。

八、SQL使用規(guī)范

1.【強(qiáng)制】禁止使用SELECT *,只獲取必要的字段,需要顯示說明列屬性。

說明:按需獲取可以減少網(wǎng)絡(luò)帶寬消耗,能有效利用覆蓋索引,表結(jié)構(gòu)變更對(duì)程序基本無影響。

2.【強(qiáng)制】禁止使用INSERT INTO t_xxx VALUES(xxx),必須顯示指定插入的列屬性。

3.【強(qiáng)制】WHERE條件中必須使用合適的類型,避免MySQL進(jìn)行隱式類型轉(zhuǎn)化。

說明:因?yàn)镸ySQL進(jìn)行隱式類型轉(zhuǎn)化之后,可能會(huì)將索引字段類型轉(zhuǎn)化成=號(hào)右邊值的類型,導(dǎo)致使用不到索引,原因和避免在索引字段中使用函數(shù)是類似的,例子 select uid from t_user where phone=15855550101(phone為 varchat 類型,此時(shí)查詢中使用數(shù)字查詢,會(huì)導(dǎo)致索引失效)。

4.【強(qiáng)制】禁止在WHERE條件的屬性上使用函數(shù)或者表達(dá)式。

5.【強(qiáng)制】禁止負(fù)向查詢,以及%開頭的模糊查詢。

6.【強(qiáng)制】應(yīng)用程序必須捕獲SQL異常,并有相應(yīng)處理。

7.【推薦】sql語句盡可能簡單、大的sql想辦法拆成小的sql語句。

說明:簡單的SQL容易使用到MySQL的querycache、減少鎖表時(shí)間特別是MyISAM、可以使用多核cpu。

8.【推薦】事務(wù)要簡單,整個(gè)事務(wù)的時(shí)間長度不要太長。

9.【強(qiáng)制】避免在數(shù)據(jù)庫中進(jìn)行數(shù)學(xué)運(yùn)算或者函數(shù)運(yùn)算(MySQL不擅長數(shù)學(xué)運(yùn)算和邏輯判斷,也容易將業(yè)務(wù)邏輯和DB耦合在一起)。

10.【推薦】sql中使用到OR的改寫為用IN() (or的效率沒有in的效率高)。

11.【參考】SQL語句中IN包含的值不應(yīng)過多,里面數(shù)字的個(gè)數(shù)建議控制在1000個(gè)以內(nèi)。

12.【推薦】limit分頁注意效率。Limit越大,效率越低??梢愿膶憀imit。

說明:改寫例子:

1)改寫方法一

延遲回表寫法 select xx,xx from t t1, (select id from t where .... limit 10000,10) t2 where t1.id = t2.id

2)改寫方法二

select id from t limit 10000, 10; 應(yīng)該改為 => select id from t where id > 10000 limit 10;

13.【推薦】盡量使用union all替代union。

14.【參考】避免使用大表JOIN。

15.【推薦】對(duì)數(shù)據(jù)的更新要打散后批量更新,不要一次更新太多數(shù)據(jù)。

16.【推薦】使用合理的SQL語句減少與數(shù)據(jù)庫的交互次數(shù)。

17.【參考】注意使用性能分析工具 Sql explain / showprofile / mysqlsla。

18.【推薦】能不用NOT IN就不用NOT IN,坑太多了,會(huì)把空和NULL給查出來。

19.【推薦】關(guān)于分頁查詢,程序里建議合理使用分頁來提高效率,limit、offset較大要配合子查詢使用。

20.【強(qiáng)制】禁止在數(shù)據(jù)庫中跑大查詢。

21.【強(qiáng)制】禁止單條SQL語句同時(shí)更新多個(gè)表。

22.【推薦】統(tǒng)計(jì)表中記錄數(shù)時(shí)使用COUNT(*),而不是COUNT(primary_key)和COUNT(1)。

說明:count( * ) 會(huì)統(tǒng)計(jì)值為 NULL 的行,而 count( 列名 ) 不會(huì)統(tǒng)計(jì)此列為 NULL 值的行。

23.【推薦】INSERT語句使用batch提交(INSERT INTO tableVALUES(),(),()……),values的個(gè)數(shù)不應(yīng)過多。

24.【推薦】獲取大量數(shù)據(jù)時(shí),建議分批次獲取數(shù)據(jù),每次獲取數(shù)據(jù)少于2000條,結(jié)果集應(yīng)小于1M。

25.【推薦】在做開發(fā)時(shí)建議使用數(shù)據(jù)庫框架(如mybatis)或prepared statement,可以提升性能并避免SQL注入。

26.【強(qiáng)制】禁止跨庫查詢(為數(shù)據(jù)遷移和分庫分表留出余地,降低耦合度,降低風(fēng)險(xiǎn))。

27.【推薦】盡量避免使用子查詢,可以把子查詢優(yōu)化為join操作(子查詢的結(jié)果集無法使用索引,子查詢會(huì)產(chǎn)生臨時(shí)表操作,如果子查詢數(shù)據(jù)量大會(huì)影響效率,消耗過多的CPU及IO資源)。

28.【強(qiáng)制】超過三個(gè)表禁止 join(需要 join 的字段,數(shù)據(jù)類型必須絕對(duì)一致;多表關(guān)聯(lián)查詢時(shí),保證被關(guān)聯(lián)的字段需要有索引。即使雙表 join 也要注意表索引、SQL 性能)。

29.【推薦】SQL 性能優(yōu)化的目標(biāo):至少要達(dá)到 range 級(jí)別,要求是 ref 級(jí)別,如果可以是 consts最好。

30.【推薦】盡量不要使用物理刪除(即直接刪除,如果要?jiǎng)h除的話提前做好備份),而是使用邏輯刪除,使用字段delete_flag做邏輯刪除,類型為tinyint,0表示未刪除,1表示已刪除。

31.【強(qiáng)制】在代碼中寫分頁查詢邏輯時(shí),若 count 為 0 應(yīng)直接返回,避免執(zhí)行后面的分頁語句。

32.【強(qiáng)制】程序連接不同的數(shù)據(jù)庫要使用不同的賬號(hào)。

33.【推薦】使用 ISNULL()來判斷是否為 NULL 值?。

九、行為規(guī)范

1.【強(qiáng)制】禁止使用應(yīng)用程序配置文件內(nèi)的帳號(hào)手工訪問線上數(shù)據(jù)庫。

2.【強(qiáng)制】禁止非DBA對(duì)線上數(shù)據(jù)庫進(jìn)行寫操作,修改線上數(shù)據(jù)需要提交工單,由DBA執(zhí)行,提交的SQL語句必須經(jīng)過測試。

3.【強(qiáng)制】禁止在線上做數(shù)據(jù)庫壓力測試。

4.【強(qiáng)制】禁止從測試、開發(fā)環(huán)境直連線上數(shù)據(jù)庫。

5.【強(qiáng)制】禁止在主庫進(jìn)行后臺(tái)統(tǒng)計(jì)操作,避免影響業(yè)務(wù),可以在離線從庫上執(zhí)行后臺(tái)統(tǒng)計(jì)?。

十、流程規(guī)范

1.【強(qiáng)制】所有的建表操作需要提前告知該表涉及的查詢sql。

2.【強(qiáng)制】所有的建表需要確定建立哪些索引后才可以建表上線。

3.【強(qiáng)制】所有的改表結(jié)構(gòu)、加索引操作都需要將涉及到所改表的查詢sql發(fā)出來告知DBA等相關(guān)人員。

4.【強(qiáng)制】在建新表加字段之前,要求至少要提前3天郵件出來,給dba們?cè)u(píng)估、優(yōu)化和審核的時(shí)間。

5.【強(qiáng)制】批量導(dǎo)入、導(dǎo)出數(shù)據(jù)需要DBA進(jìn)行審查,并在執(zhí)行過程中觀察服務(wù)。

6.【強(qiáng)制】禁止有super權(quán)限的應(yīng)用程序賬號(hào)存在。

7.【強(qiáng)制】推廣活動(dòng)或上線新功能必須提前通知DBA進(jìn)行流量評(píng)估。

8.【強(qiáng)制】不在業(yè)務(wù)高峰期批量更新、查詢數(shù)據(jù)庫。

9.【強(qiáng)制】隔離線上線下環(huán)境(開發(fā)測試程序禁止訪問線上數(shù)據(jù)庫)。

10.【強(qiáng)制】在對(duì)大表做表結(jié)構(gòu)變更時(shí),如修改字段屬性會(huì)造成鎖表,并會(huì)造成從庫延遲,從而影響線上業(yè)務(wù),必須在凌晨后業(yè)務(wù)低峰期執(zhí)行,另統(tǒng)一用工具pt-online-schema-change避免鎖表且降低延遲執(zhí)行時(shí)間。

11.【強(qiáng)制】核心業(yè)務(wù)數(shù)據(jù)庫變更需在凌晨執(zhí)行。

12.【推薦】匯總庫開啟Audit審計(jì)日志功能,出現(xiàn)問題時(shí)方可追溯。

13.【強(qiáng)制】給業(yè)務(wù)方開權(quán)限時(shí),密碼要用MD5加密,至少16位。權(quán)限如沒有特殊要求,均為select查詢權(quán)限,并做庫表級(jí)限制。

14.【推薦】如果出現(xiàn)業(yè)務(wù)部門人為誤操作導(dǎo)致數(shù)據(jù)丟失,需要恢復(fù)數(shù)據(jù),請(qǐng)?jiān)诘谝粫r(shí)間通知DBA,并提供準(zhǔn)確時(shí)間,誤操作語句等重要線索。

15.【強(qiáng)制】批量更新數(shù)據(jù),如update,delete 操作,需要DBA進(jìn)行審查,并在執(zhí)行過程中觀察服務(wù)。

16.【強(qiáng)制】業(yè)務(wù)部門程序出現(xiàn)bug等影響數(shù)據(jù)庫服務(wù)的問題,請(qǐng)及時(shí)通知DBA便于維護(hù)服務(wù)穩(wěn)定。

17.【強(qiáng)制】線上數(shù)據(jù)庫的變更操作必須提供對(duì)應(yīng)的回滾方案。

18.【強(qiáng)制】批量清洗數(shù)據(jù),需要開發(fā)和DBA共同進(jìn)行審查,應(yīng)避開業(yè)務(wù)高峰期時(shí)段執(zhí)行,并在執(zhí)行過程中觀察服務(wù)狀態(tài)。

19.【強(qiáng)制】數(shù)據(jù)訂正如刪除和修改記錄時(shí),要先 select ,確認(rèn)無誤才能執(zhí)行更新語句,避免出現(xiàn)誤刪除。

作者丨修冶

來源丨公眾號(hào):阿里云開發(fā)者(ID:ali_tech)

分享到:
標(biāo)簽:設(shè)計(jì) MySQL
用戶無頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績?cè)u(píng)定