MySQL開發(fā)規(guī)范

一、基礎(chǔ)規(guī)范
?
1) ? ?使用InnoDB存儲引擎
2) ? ?數(shù)據(jù)庫字符集使用UTF8,校對字符集使用utf8_general_ci
3) ? ?所有表、字段都盡量添加注釋
4) ? ?庫名、表名、字段名使用小寫字母,禁止超過32個(gè)字符,須見名知意
5) ? ?非唯一索引以 “idx_字段1_字段2” 命名,唯一索引必須以 “uniq_字段1_字段2” 命名
?
二、查詢規(guī)范
?
1) ? ?SQL語句盡可能簡單,大的SQL想辦法拆分成小的SQL實(shí)現(xiàn)
2) ? ?不要使用SELECT * ,查詢具體要用到的字段
3) ? ?禁止like做where條件(會全表掃描且不能用索引)
4) ? ?除非必要,避免使用 != 等非等值操作符(會導(dǎo)致用不到索引)
5) ? ?Where條件里不要對列使用函數(shù)(不會引用索引)
6) ? ?能確定返回結(jié)果只有一條時(shí),使用limit 1(LIMIT分頁注意效率,LIMIT越大,效率越低)
7) ? ?少用子查詢,改用JOIN(子查詢要在內(nèi)存里建臨時(shí)表)
8) ? ?多表JOIN的字段,區(qū)分度最大的字段放在前面
9) ? ?IN條件里的數(shù)據(jù)數(shù)量要盡量少,超過200個(gè)用EXIST代替IN
10) ? ?Where字句中同一個(gè)表的不同字段組合建議小于5組(否則考慮分表)
11) ? ?禁止單條語句同時(shí)更新多個(gè)表
12) ? ?事務(wù)要盡量簡單,整個(gè)事務(wù)的時(shí)間長度不要太長
三、表設(shè)計(jì)規(guī)范
?
1) ? ?用DECIMAL代替FLOAT和DOUBLE存儲精確浮點(diǎn)數(shù)(精確數(shù)據(jù))
2) ? ?使用TINYINT代替ENUM類型(便于遷移時(shí)兼容)
3) ? ?盡可能不使用TEXT、BLOB類型(該數(shù)據(jù)類型不能設(shè)置默認(rèn)值、不便于排序、不便于建立索引)
4) ? ?同一意義的字段設(shè)計(jì)定義必須相同(便于聯(lián)表查詢)
5) ? ?所有字段均定義為NOT NULL(避免使用NULL字段,NULL字段很難查詢優(yōu)化,NULL字段的索引需要額外空間,NULL字段的復(fù)合索引無效)
6) ? ?表必須有主鍵,不使用更新頻繁的列做主鍵、盡量不使用字符串列做主鍵,盡量使用非空的唯一自增鍵做主鍵
四、索引設(shè)計(jì)規(guī)范
?
1) ? ?單表索引數(shù)量不超過10個(gè)
2) ? ?單個(gè)字段不要超過兩個(gè)索引
3) ? ?新建的唯一索引必須不能和主鍵重復(fù)
4) ? ?避免冗余和重復(fù)索引
5) ? ?盡量不要在頻繁更新的列上建立索引
6) ? ?不在低基數(shù)列上建立索引,例如狀態(tài)、類型等
7) ? ?不在索引列進(jìn)行數(shù)學(xué)運(yùn)算和函數(shù)運(yùn)算(參與了運(yùn)算的列不會引用索引)
8) ? ?復(fù)合索引須符合最左前綴的特點(diǎn)建立索引(mysql使用復(fù)合索引時(shí)從左向右匹配)
9) ? ?重要的SQL中where條件里的字段必須被索引
10) ? ?Where條件里的字段順序與索引順序無關(guān),優(yōu)化器會自動(dòng)調(diào)整
11) ? ?索引選擇性= Cardinality / Total Rows,即基數(shù) ÷ 數(shù)據(jù)行數(shù),值越接近1說明使用索引的過濾效果越好
12) ? ?建立索引時(shí),務(wù)必先explain,查看索引使用情況