優先選擇符合存儲須要的最小的數據類型:算法
對於非負數據採用無符號整型進行存儲;數據庫
varchar(N)中N表明字符數,不是字節數(Oracle中是字節數,如中文GBK下2字節存一個漢字),即MySQL中varchar(2)可存儲2個漢字,佔用6個字節(UTF8)。安全
避免使用text,blob數據類型:網絡
常見的text類型可存儲64k,通常是使用不到這麼大空間;oracle
非要使用,建議把blob或text列分離到單獨的擴展表中,且避免使用select *;ide
text, blob僅能使用前綴索引,且默認狀況下text,blob列均不能有默認值。函數
避免使用ENUM數據類型:優化
修改ENUM值須要alter語句;spa
ENUM類型的ORDER BY操做效率低,須要額外操做;設計
禁止使用數值做爲ENUM的枚舉值。
儘量把全部列定義爲NOTNULL:
索引NULL列需佔用額外的空間來保存(是否爲空),因此佔用更多空間;
比較和計算對NULL作特別處理,可能索引會失效。
使用TIMESTAMP或DATETIME類型存儲時間:
TIMESTAMP 1970-01-01~2038-01-19,佔用4字節和INT存儲相同;
其餘範圍使用DATETIME類型存儲。
金融財務相關類數據,使用DECIMAL類型:
佔用空間有定義的寬度決定;
可用於存儲比bigint更大的整數數據。
建議使用預編譯語句進行數據庫操做:
只傳參數,比傳遞SQL語句更高效;
相同語句能夠一次解析,屢次使用,提升處理效率。
避免數據類型的隱式轉換:
隱式轉換可能致使索引失效。
充分利用表上已存在的索引:
避免使用雙%的查詢條件,如’123%’可以使用索引;
一個SQL只能使用聯合索引一列進行範圍查詢;
PS:index(a, b, c),where a = xxand b > low and b < high可以使用到b列的索引,
wherea > low and a < high and b = xx,b這列使用不到索引;
這個處理和oracle的聯合索引是一致的。
使用left join或not exists來優化not in操做。
禁止跨庫查詢:
程序鏈接不一樣數據庫使用不一樣的帳號;
爲數據庫遷移和分庫分表留出餘地;
下降業務的耦合度;
避免權限過大產生的安全風險,SQL注入也只能看到一個庫。
禁止使用Select *:
消耗過多的CPU, IO, 網絡資源;
沒法使用覆蓋索引;
可減小表結構變動帶來的影響。
禁止使用不含字段列表的INSERT:
INSERT INTO T(A, B) VALUES(…….);
可減小表結構變動帶來的影響。
儘可能避免使用子查詢,能夠把子查詢優化爲join操做:
固然並非全部的子查詢都能轉換爲join,如group by等得子查詢;
一般是IN子查詢這樣的語句。
子查詢結果集沒法使用索引;子查詢會產生臨時表操做,若是子查詢數據量大將嚴重影響效率;消耗過多的CPU、IO。
避免使用JOIN關聯太多的表:
每Join一個表多佔用一部份內存(join_buffer_size);
會產生臨時表操做,影響查詢效率;
MySQL最多容許關聯61個表,建議不超過5個。
減小同數據庫的交互次數:
數據庫更適合作批量操做;
合併多個相同的操做到一塊兒;
PS:如alter table t addcolumn c1 int, change column c2 c2 int…
使用in代替or:
in的值不要超過500個;
in操做能夠有效的利用索引。
禁止使用order byrand()進行隨機排序:
會把表中全部知足條件的數據裝載到內存中進行排序;
消耗大量的CPU/IO/MEM;
處理方式:推薦在程序中獲取一個隨機值,而後在數據庫中獲取數據的方式(親認爲開發人員願意去實現多餘的算法嗎?都但願一句SQL返回結果集)。
WHERE從句禁止對列進行函數轉換和計算:
where date(createtime) = ‘20171010’ à where createtime >= ‘20171010’ and createtime < ‘20171011’
UNIONALL OR UNION:
這兩種排序方式和Oracle的徹底一致,UNION ALL不排序,UNION排序。
拆分複雜SQL爲多個小SQL:
MySQL一個SQL只能使用一個CPU進行計算;
SQL拆分後能夠經過並行查詢提升處理效率。
超過100W行數據批量DML操做,要分批屢次進行操做:
需考慮主從延遲;
binlog日誌爲row格式產生大量日誌;
避免大事務的操做,阻塞並行。
大表表結構修改:
推薦使用pt-online-schema-change修改表結構;
可避免大表修改產生的主動延遲;
避免在對錶字段修改時進行鎖表。
禁止爲程序帳號賦予super權限:
當達到最大鏈接數限制時,還容許使用一個帶有super權限的用戶鏈接;
super權限只能留給DBA處理問題的帳號使用。
對程序帳號,遵循權限最小的原則:
程序在使用數據庫帳號只能在一個DB下使用,不容許跨庫使用;
程序帳號原則上不容許有drop權限。