一:新建表和字段建議:
1.所有數(shù)據(jù)表和字段要有清晰的注釋黍特,字段說明
說明:不管是創(chuàng)建者還是其他開發(fā)或者后續(xù)維護者都能清楚知道數(shù)據(jù)表和字段定義的含義
2.表名、字段名使用小寫字母或數(shù)字锯蛀,禁止出現(xiàn)數(shù)字開頭
說明:MySQL在Windows下不區(qū)分大小寫灭衷,但在Linux下默認是區(qū)分大小寫,為了避免出現(xiàn)不必要的麻煩旁涤,統(tǒng)一使用小寫
3.每個列都設置為not null(如果列為BLOB/TEXT類型的翔曲,則這個列不能設置為NOT NULL),且定義默認值
說明:3.1:NOT IN劈愚、!= 等負向條件查詢在有 NULL 值的情況下返回非空行的結(jié)果集
3.2:使用 concat 函數(shù)拼接時瞳遍,首先要對各個字段進行非 NULL 判斷,否則只要任何一個字段為空都會造成拼接的結(jié)果為 NULL
3.3:當用count函數(shù)進行統(tǒng)計時菌羽,NULL 列不會計入統(tǒng)計
3.4:因為NULL的列使得索引傅蹂,索引統(tǒng)計和值比較都更復雜,可為NULL的列會使用更多的存儲空間算凿,在mysql里也需要特殊處理,當可為NULL的列被索引時犁功,每個索引記錄需要一個額外的字節(jié)氓轰,如果計劃在列上建索引,應該避免將列設計為NULL浸卦。
4.每個表有自增列id且為主鍵署鸡,使用無符號類型unsigned,不作業(yè)務邏輯使用
說明:4.1:避免存儲負值限嫌,且擴大了表示范圍
4.2:如果使用非自增主鍵(如果身份證號或?qū)W號等)靴庆,由于每次插入主鍵的值近似于隨機,因此每次新紀錄都要被插到現(xiàn)有索引頁得中間某個位置怒医,此時MySQL不得不為了將新記錄插到合適位置而移動數(shù)據(jù)炉抒,甚至目標頁面可能已經(jīng)被回寫到磁盤上而從緩存中清掉,此時又要從磁盤上讀回來稚叹,這增加了很多開銷焰薄,同時頻繁的移動拿诸、分頁操作造成了大量的碎片,得到了不夠緊湊的索引結(jié)構(gòu)塞茅,后續(xù)不得不通過OPTIMIZE TABLE來重建表并優(yōu)化填充頁面
5.表達是否概念的列亩码,使用is_xxx的方式命名,數(shù)據(jù)類型使用unsigned tinyint(1表示是野瘦,0表示否)
例如:is_valid描沟,1.表示有效 0.表示無效
6.禁止使用mysql保留字,例如desc鞭光,range吏廉,match,action衰猛,add迟蜜,alter,all..等等
更多保留字可以參考mysql官方文檔說明:https://dev.mysql.com/doc/refman/5.7/en/keywords.html
7.varchar是可變長字符串啡省,不預先分配存儲空間娜睛,長度不要超過5000,如果存儲長度大于此值卦睹,定義字段類型為text畦戒,獨立出來一張表,用主鍵來對應结序,避免影響其它字段索引效率
8.單表行數(shù) 超過500萬行或者表單容量超過2GB障斋,才推薦進行分庫分表
9.命令規(guī)范:主鍵索引名以pk_字段名;唯一索引名uk_字段名徐鹤;普通索引名idx_字段名垃环;臨時表則以tmp為前綴
10.小數(shù)類型為decimal,禁止使用float和double
說明:float和double的存儲的時候返敬,存在精度損失的問題遂庄,很可能在值的比較時,得到不正確的結(jié)果劲赠。如果存儲的數(shù)據(jù)范圍超過decimal的范圍涛目,建議將數(shù)據(jù)拆成整數(shù)和小數(shù)分開存儲
11.字段允許適當冗余,以提高查詢性能凛澎,冗余字段應遵循:1)不是頻繁修改的字段霹肝。2)不是varchar超長字段,更不能是text字段塑煎。
12.InnoDB和MyISAM存儲引擎表沫换,索引類型選擇BTREE;MEMORY表可以根據(jù)需要選擇HASH或者BTREE類型索引轧叽。
13.在建立索引時苗沧,多考慮建立聯(lián)合索引刊棕,并把區(qū)分度最高的字段放在最前面,這樣可以更高效檢索數(shù)據(jù)
14.合適的字符存儲長度待逞,不但節(jié)約數(shù)據(jù)庫表空間甥角、節(jié)約索引存儲,更重要的是提升檢索速度
對象年齡區(qū)間類型字節(jié)表示范圍
人150之內(nèi)unsigned tinyint1無符號:0-255
龜數(shù)百歲unsigned smallint2無符號:0-65535
恐龍化石數(shù)千年unsigned int4無符號:0-42.9億
太陽約50億年unsigned bigint8無符號:0-約10的19次方
二:增刪改查好習慣
1.SELECT語句指定具體字段名稱识樱,禁止寫成*嗤无,select *會將不該讀的數(shù)據(jù)也從MySQL里讀出來,造成不必要的帶寬壓力
2.分頁查詢怜庸,當limit起點較高時当犯,可先用過濾條件進行過濾。如select f1,f2,f3 from table1 limit 20000,20;優(yōu)化為: select f1,f2,f3 from table1 where id>20000 limit 20
3.where條件里等號左右字段類型一致割疾,否則無法利用索引
4.在多表join中嚎卫,盡量選取結(jié)果集較小的表作為驅(qū)動表,來join其他表
5.插入列列表與值列表個數(shù)相同宏榕,上面二者的個數(shù)需要相同拓诸,如果沒有指定列列表,則值列表長度要與表列數(shù)相同麻昼。
6.更新刪除影響行數(shù)不要太大奠支,如果太大,進行細粒度拆分
7.更新抚芦,刪除語句記得隨手寫好where條件(你想刪庫嗎倍谜?哈哈)
歡迎大家補充,一起建立更優(yōu)雅的數(shù)據(jù)規(guī)范