優(yōu)先選擇符合存儲(chǔ)需要的最小的數(shù)據(jù)類型:
南皮ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來市場(chǎng)廣闊!成為成都創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:028-86922220(備注:SSL證書合作)期待與您的合作!
對(duì)于非負(fù)數(shù)據(jù)采用無符號(hào)整型進(jìn)行存儲(chǔ);
varchar(N)中N代表字符數(shù),不是字節(jié)數(shù)(Oracle中是字節(jié)數(shù),如中文GBK下2字節(jié)存一個(gè)漢字),即MySQL中varchar(2)可存儲(chǔ)2個(gè)漢字,占用6個(gè)字節(jié)(UTF8)。
避免使用text,blob數(shù)據(jù)類型:
常見的text類型可存儲(chǔ)64k,一般是使用不到這么大空間;
非要使用,建議把blob或text列分離到單獨(dú)的擴(kuò)展表中,且避免使用select *;
text, blob僅能使用前綴索引,且默認(rèn)情況下text,blob列均不能有默認(rèn)值。
避免使用ENUM數(shù)據(jù)類型:
修改ENUM值需要alter語句;
ENUM類型的ORDER BY操作效率低,需要額外操作;
禁止使用數(shù)值作為ENUM的枚舉值。
盡可能把所有列定義為NOTNULL:
索引NULL列需占用額外的空間來保存(是否為空),所以占用更多空間;
比較和計(jì)算對(duì)NULL做特別處理,可能索引會(huì)失效。
使用TIMESTAMP或DATETIME類型存儲(chǔ)時(shí)間:
TIMESTAMP 1970-01-01~2038-01-19,占用4字節(jié)和INT存儲(chǔ)相同;
其他范圍使用DATETIME類型存儲(chǔ)。
金融財(cái)務(wù)相關(guān)類數(shù)據(jù),使用DECIMAL類型:
占用空間有定義的寬度決定;
可用于存儲(chǔ)比bigint更大的整數(shù)數(shù)據(jù)。
建議使用預(yù)編譯語句進(jìn)行數(shù)據(jù)庫操作:
只傳參數(shù),比傳遞SQL語句更高效;
相同語句可以一次解析,多次使用,提高處理效率。
避免數(shù)據(jù)類型的隱式轉(zhuǎn)換:
隱式轉(zhuǎn)換可能導(dǎo)致索引失效。
充分利用表上已存在的索引:
避免使用雙%的查詢條件,如’123%’可使用索引;
一個(gè)SQL只能使用聯(lián)合索引一列進(jìn)行范圍查詢;
PS:index(a, b, c),where a = xxand b > low and b < high可使用到b列的索引,
wherea > low and a < high and b = xx,b這列使用不到索引;
這個(gè)處理和oracle的聯(lián)合索引是一致的。
使用left join或not exists來優(yōu)化not in操作。
禁止跨庫查詢:
程序連接不同數(shù)據(jù)庫使用不同的賬號(hào);
為數(shù)據(jù)庫遷移和分庫分表留出余地;
降低業(yè)務(wù)的耦合度;
避免權(quán)限過大產(chǎn)生的安全風(fēng)險(xiǎn),SQL注入也只能看到一個(gè)庫。
禁止使用Select *:
消耗過多的CPU, IO, 網(wǎng)絡(luò)資源;
無法使用覆蓋索引;
可減少表結(jié)構(gòu)變更帶來的影響。
禁止使用不含字段列表的INSERT:
INSERT INTO T(A, B) VALUES(…….);
可減少表結(jié)構(gòu)變更帶來的影響。
盡量避免使用子查詢,可以把子查詢優(yōu)化為join操作:
當(dāng)然并不是所有的子查詢都能轉(zhuǎn)換為join,如group by等得子查詢;
通常是IN子查詢這樣的語句。
子查詢結(jié)果集無法使用索引;子查詢會(huì)產(chǎn)生臨時(shí)表操作,如果子查詢數(shù)據(jù)量大將嚴(yán)重影響效率;消耗過多的CPU、IO。
避免使用JOIN關(guān)聯(lián)太多的表:
每Join一個(gè)表多占用一部分內(nèi)存(join_buffer_size);
會(huì)產(chǎn)生臨時(shí)表操作,影響查詢效率;
MySQL最多允許關(guān)聯(lián)61個(gè)表,建議不超過5個(gè)。
減少同數(shù)據(jù)庫的交互次數(shù):
數(shù)據(jù)庫更適合做批量操作;
合并多個(gè)相同的操作到一起;
PS:如alter table t addcolumn c1 int, change column c2 c2 int…
使用in代替or:
in的值不要超過500個(gè);
in操作可以有效的利用索引。
禁止使用order byrand()進(jìn)行隨機(jī)排序:
會(huì)把表中所有滿足條件的數(shù)據(jù)裝載到內(nèi)存中進(jìn)行排序;
消耗大量的CPU/IO/MEM;
處理方式:推薦在程序中獲取一個(gè)隨機(jī)值,然后在數(shù)據(jù)庫中獲取數(shù)據(jù)的方式(親認(rèn)為開發(fā)人員愿意去實(shí)現(xiàn)多余的算法嗎?都希望一句SQL返回結(jié)果集)。
WHERE從句禁止對(duì)列進(jìn)行函數(shù)轉(zhuǎn)換和計(jì)算:
where date(createtime) = ‘20171010’ à where createtime >= ‘20171010’ and createtime < ‘20171011’
UNIONALL OR UNION:
這兩種排序方式和Oracle的完全一致,UNION ALL不排序,UNION排序。
拆分復(fù)雜SQL為多個(gè)小SQL:
MySQL一個(gè)SQL只能使用一個(gè)CPU進(jìn)行計(jì)算;
SQL拆分后可以通過并行查詢提高處理效率。
超過100W行數(shù)據(jù)批量DML操作,要分批多次進(jìn)行操作:
需考慮主從延遲;
binlog日志為row格式產(chǎn)生大量日志;
避免大事務(wù)的操作,阻塞并行。
大表表結(jié)構(gòu)修改:
推薦使用pt-online-schema-change修改表結(jié)構(gòu);
可避免大表修改產(chǎn)生的主動(dòng)延遲;
避免在對(duì)表字段修改時(shí)進(jìn)行鎖表。
禁止為程序賬號(hào)賦予super權(quán)限:
當(dāng)達(dá)到最大連接數(shù)限制時(shí),還允許使用一個(gè)帶有super權(quán)限的用戶連接;
super權(quán)限只能留給DBA處理問題的賬號(hào)使用。
對(duì)程序賬號(hào),遵循權(quán)限最小的原則:
程序在使用數(shù)據(jù)庫賬號(hào)只能在一個(gè)DB下使用,不允許跨庫使用;
程序賬號(hào)原則上不允許有drop權(quán)限。
當(dāng)前文章:MySQL設(shè)計(jì)規(guī)范(續(xù))
URL鏈接:http://jinyejixie.com/article30/ggsppo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、自適應(yīng)網(wǎng)站、網(wǎng)站維護(hù)、App設(shè)計(jì)、網(wǎng)站建設(shè)、響應(yīng)式網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)