1. 表里必須要有create_time(datetime) , update_time (datetime) , expired (tinyint) 字段.
2. 表名、字段名必須使用小寫字母,可以使用數(shù)字結尾 禁止數(shù)顯數(shù)字開頭.
3. 禁用保留字,如 desc岁经、range、match、delayed等,請參考 MySQL官方保留字
4. 唯一索引名為 uk_字段名获询;普通索引名則為 idx_字段名。
5. 小數(shù)類型為 decimal拐袜,禁止使用 float和 double吉嚣。
說明:float和 double在存儲的時候,存在精度損失的問題蹬铺,很可能在值的比較時瓦戚,得到不正確的結果。如果存儲的數(shù)據(jù)范圍超過 decimal的范圍丛塌,建議將數(shù)據(jù)拆成整數(shù)和小數(shù)分開存儲较解。
6. varchar是可變長字符串,不預先分配存儲空間赴邻,長度不要超過 5000印衔,如果存儲長度大于此值,定義字段類型為 text姥敛,獨立出來一張表奸焙,用主鍵來對應,避免影響其它字段索引效率。
7. 庫名與應用名稱盡量一致,表名盡量和POJO名字一致或保持某種規(guī)范
8. 能分庫盡量不要分表与帆,業(yè)務表在5千萬內盡量不考慮分表
9. 業(yè)務上具有唯一特性的字段了赌,即使是組合字段,也必須建成唯一索引玄糟。不要以為唯一索引影響了 insert速度勿她,這個速度損耗可以忽略,但提高查找速度是明顯的
10. 禁止使用表關聯(lián)阵翎,如果需要盡量采用in的方式或修改表結構完成
11. 禁止在sql的where語句后面使用函數(shù)逢并,在select條件里酌情考慮使用
12. update 語句多考慮where語句后面的條件是否走索引,否則容易產生鎖表操作
13. like 語句可以使用郭卫,但只允許使用想做匹配 如 name like 'd%'
14. 如果有 order by的場景砍聊,請注意利用索引的有序性。order by 最后的字段是組合索引的一部分贰军,并且放在索引組合順序的最后
正例:where a=? and b=? order by c; 索引:a_b_c
反例:索引中有范圍查找玻蝌,那么索引有序性無法利用,如:WHERE a>10 ORDER BY b; 索引a_b無法排序词疼。
15 SQL性能優(yōu)化的目標:至少要達到 range 級別灶伊,要求是 ref級別,如果可以是 consts最好寒跳。
說明:
1)consts 單表中最多只有一個匹配行(主鍵或者唯一索引),在優(yōu)化階段即可讀取到數(shù)據(jù)竹椒。
2)ref 指的是使用普通的索引(normal index)童太。
3)range 對索引進行范圍檢索。
反例:explain表的結果胸完,type=index书释,索引物理文件全掃描,速度非常慢赊窥,這個 index級別比較 range還低爆惧,與全表掃描是小巫見大巫。
16 建組合索引的時候锨能,區(qū)分度最高的在最左邊扯再。
正例:如果 where a=? and b=? ,a列的幾乎接近于唯一值址遇,那么只需要單建 idx_a索引即可熄阻。
說明:存在非等號和等號混合判斷條件時,在建索引時倔约,請把等號條件的列前置秃殉。如:where a>?and b=? 那么即使 a的區(qū)分度更高,也必須把 b放在索引的最前列。
17. 10.【參考】創(chuàng)建索引時避免有如下極端誤解:
1)誤認為一個查詢就需要建一個索引钾军。
2)誤認為索引會消耗空間鳄袍、嚴重拖慢更新和新增速度。
3)誤認為唯一索引一律需要在應用層通過“先查后插”方式解決吏恭。
18. 數(shù)據(jù)庫字段盡量不要出現(xiàn)null
19. 不要使用 count(列名)或 count(常量)來替代 count(*)拗小,count(*)就是 SQL92定義的標準統(tǒng)計行數(shù)的語法,跟數(shù)據(jù)庫無關砸泛,跟 NULL和非 NULL無關十籍。
說明:count(*)會統(tǒng)計值為 NULL的行,而 count(列名)不會統(tǒng)計此列為 NULL值的行唇礁。