一:新建表和字段建議:
1.所有數(shù)據(jù)表和字段要有清晰的注釋,字段說明
說明:不管是創(chuàng)建者還是其他開發(fā)或者后續(xù)維護(hù)者都能清楚知道數(shù)據(jù)表和字段定義的含義
2.表名、字段名使用小寫字母或數(shù)字,禁止出現(xiàn)數(shù)字開頭
說明:MySQL在windows下不區(qū)分大小寫,但在linux下默認(rèn)是區(qū)分大小寫,為了避免出現(xiàn)不必要的麻煩,統(tǒng)一使用小寫
3.每個(gè)列都設(shè)置為not null(如果列為BLOB/TEXT類型的,則這個(gè)列不能設(shè)置為NOT NULL),且定義默認(rèn)值
說明:3.1:NOT IN、!= 等負(fù)向條件查詢?cè)谟?NULL 值的情況下返回非空行的結(jié)果集
3.2:使用 concat 函數(shù)拼接時(shí),首先要對(duì)各個(gè)字段進(jìn)行非 NULL 判斷,否則只要任何一個(gè)字段為空都會(huì)造成拼接的結(jié)果為 NULL
3.3:當(dāng)用count函數(shù)進(jìn)行統(tǒng)計(jì)時(shí),NULL 列不會(huì)計(jì)入統(tǒng)計(jì)
3.4:因?yàn)镹ULL的列使得索引,索引統(tǒng)計(jì)和值比較都更復(fù)雜,可為NULL的列會(huì)使用更多的存儲(chǔ)空間,在mysql里也需要特殊處理,當(dāng)可為NULL的列被索引時(shí),每個(gè)索引記錄需要一個(gè)額外的字節(jié),如果計(jì)劃在列上建索引,應(yīng)該避免將列設(shè)計(jì)為NULL。
4.每個(gè)表有自增列id且為主鍵,使用無(wú)符號(hào)類型unsigned,不作業(yè)務(wù)邏輯使用
說明:4.1:避免存儲(chǔ)負(fù)值,且擴(kuò)大了表示范圍
4.2:如果使用非自增主鍵(如果身份證號(hào)或?qū)W號(hào)等),由于每次插入主鍵的值近似于隨機(jī),因此每次新紀(jì)錄都要被插到現(xiàn)有索引頁(yè)得中間某個(gè)位置,此時(shí)MySQL不得不為了將新記錄插到合適位置而移動(dòng)數(shù)據(jù),甚至目標(biāo)頁(yè)面可能已經(jīng)被回寫到磁盤上而從緩存中清掉,此時(shí)又要從磁盤上讀回來,這增加了很多開銷,同時(shí)頻繁的移動(dòng)、分頁(yè)操作造成了大量的碎片,得到了不夠緊湊的索引結(jié)構(gòu),后續(xù)不得不通過OPTIMIZE TABLE來重建表并優(yōu)化填充頁(yè)面
5.表達(dá)是否概念的列,使用is_xxx的方式命名,數(shù)據(jù)類型使用unsigned tinyint(1表示是,0表示否)
例如:is_valid,1.表示有效 0.表示無(wú)效
6.禁止使用mysql保留字,例如desc,range,match,action,add,alter,all..等等
更多保留字可以參考mysql官方文檔說明:https://dev.mysql.com/doc/refman/5.7/en/keywords.html
7.varchar是可變長(zhǎng)字符串,不預(yù)先分配存儲(chǔ)空間,長(zhǎng)度不要超過5000,如果存儲(chǔ)長(zhǎng)度大于此值,定義字段類型為text,獨(dú)立出來一張表,用主鍵來對(duì)應(yīng),避免影響其它字段索引效率
8.單表行數(shù) 超過500萬(wàn)行或者表單容量超過2GB,才推薦進(jìn)行分庫(kù)分表
9.命令規(guī)范:主鍵索引名以pk_字段名;唯一索引名uk_字段名;普通索引名idx_字段名;臨時(shí)表則以tmp為前綴
10.小數(shù)類型為decimal,禁止使用float和double
說明:float和double的存儲(chǔ)的時(shí)候,存在精度損失的問題,很可能在值的比較時(shí),得到不正確的結(jié)果。如果存儲(chǔ)的數(shù)據(jù)范圍超過decimal的范圍,建議將數(shù)據(jù)拆成整數(shù)和小數(shù)分開存儲(chǔ)
11.字段允許適當(dāng)冗余,以提高查詢性能,冗余字段應(yīng)遵循:1)不是頻繁修改的字段。2)不是varchar超長(zhǎng)字段,更不能是text字段。
12.InnoDB和MyISAM存儲(chǔ)引擎表,索引類型選擇BTREE;MEMORY表可以根據(jù)需要選擇HASH或者BTREE類型索引。
13.在建立索引時(shí),多考慮建立聯(lián)合索引,并把區(qū)分度最高的字段放在最前面,這樣可以更高效檢索數(shù)據(jù)
14.合適的字符存儲(chǔ)長(zhǎng)度,不但節(jié)約數(shù)據(jù)庫(kù)表空間、節(jié)約索引存儲(chǔ),更重要的是提升檢索速度

二:增刪改查好習(xí)慣
1.SELECT語(yǔ)句指定具體字段名稱,禁止寫成*,select *會(huì)將不該讀的數(shù)據(jù)也從MySQL里讀出來,造成不必要的帶寬壓力
2.分頁(yè)查詢,當(dāng)limit起點(diǎn)較高時(shí),可先用過濾條件進(jìn)行過濾。如select f1,f2,f3 from table1 limit 20000,20;優(yōu)化為: select f1,f2,f3 from table1 where id>20000 limit 20
3.where條件里等號(hào)左右字段類型一致,否則無(wú)法利用索引
4.在多表join中,盡量選取結(jié)果集較小的表作為驅(qū)動(dòng)表,來join其他表
5.插入列列表與值列表個(gè)數(shù)相同,上面二者的個(gè)數(shù)需要相同,如果沒有指定列列表,則值列表長(zhǎng)度要與表列數(shù)相同。
6.更新刪除影響行數(shù)不要太大,如果太大,進(jìn)行細(xì)粒度拆分
7.更新,刪除語(yǔ)句記得隨手寫好where條件(你想刪庫(kù)嗎?哈哈)
歡迎大家補(bǔ)充,一起建立更優(yōu)雅的數(shù)據(jù)規(guī)范。
來源:https://www.cnblogs.com/peyshine/p/12928825.html