用了這麼多年MySql,這些好習慣你用過哪些

一:新建表和字段建議:

1.全部數據表和字段要有清晰的註釋,字段說明
  說明:不論是建立者仍是其餘開發或者後續維護者都能清楚知道數據表和字段定義的含義
 
2.表名、字段名使用小寫字母或數字,禁止出現數字開頭
  說明:MySQL在Windows下不區分大小寫,但在Linux下默認是區分大小寫,爲了不出現沒必要要的麻煩,統一使用小寫
 
3.每一個列都設置爲not null(若是列爲BLOB/TEXT類型的,則這個列不能設置爲NOT NULL),且定義默認值
  說明:3.1:NOT IN、!= 等負向條件查詢在有 NULL 值的狀況下返回非空行的結果集
  3.2:使用 concat 函數拼接時,首先要對各個字段進行非 NULL 判斷,不然只要任何一個字段爲空都會形成拼接的結果爲 NULL
  3.3:當用count函數進行統計時,NULL 列不會計入統計
  3.4:由於NULL的列使得索引,索引統計和值比較都更復雜,可爲NULL的列會使用更多的存儲空間,在mysql裏也須要特殊處理,當可爲NULL的列被索引時,每一個索引記錄須要一個額外的字節,若是計劃在列上建索引,應該避免將列設計爲NULL。
 
4.每一個表有自增列id且爲主鍵,使用無符號類型unsigned,不做業務邏輯使用
  說明:4.1:避免存儲負值,且擴大了表示範圍
  4.2:若是使用非自增主鍵(若是身份證號或學號等),因爲每次插入主鍵的值近似於隨機,所以每次新紀錄都要被插到現有索引頁得中間某個位置,此時MySQL不得不爲了將新記錄插到合適位置而移動數據,甚至目標頁面可能已經被回寫到磁盤上而從緩存中清掉,此時又要從磁盤上讀回來,這增長了不少開銷,同時頻繁的移動、分頁操做形成了大量的碎片,獲得了不夠緊湊的索引結構,後續不得不經過OPTIMIZE TABLE來重建表並優化填充頁面
 
5.表達是否概念的列,使用is_xxx的方式命名,數據類型使用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.單錶行數 超過500萬行或者表單容量超過2GB,才推薦進行分庫分表
 
9.命令規範:主鍵索引名以pk_字段名;惟一索引名uk_字段名;普通索引名idx_字段名;臨時表則以tmp爲前綴
 
10.小數類型爲decimal,禁止使用float和double
  說明:float和double的存儲的時候,存在精度損失的問題,極可能在值的比較時,獲得不正確的結果。若是存儲的數據範圍超過decimal的範圍,建議將數據拆成整數和小數分開存儲
 
11.字段容許適當冗餘,以提升查詢性能,冗餘字段應遵循:1)不是頻繁修改的字段。2)不是varchar超長字段,更不能是text字段。
 
12.InnoDB和MyISAM存儲引擎表,索引類型選擇BTREE;MEMORY表能夠根據須要選擇HASH或者BTREE類型索引。
 
13.在創建索引時,多考慮創建聯合索引,並把區分度最高的字段放在最前面,這樣能夠更高效檢索數據
 
14.合適的字符存儲長度,不但節約數據庫表空間、節約索引存儲,更重要的是提高檢索速度
 
對象
年齡區間
類型
字節
表示範圍
150以內
unsigned tinyint
1
無符號:0-255
數百歲
unsigned smallint
2
無符號:0-65535
恐龍化石
數千年
unsigned int
4
無符號:0-42.9億
太陽
約50億年
unsigned bigint
8
無符號:0-約10的19次方
 

二:增刪改查好習慣

 
1.SELECT語句指定具體字段名稱,禁止寫成*,select *會將不應讀的數據也從MySQL裏讀出來,形成沒必要要的帶寬壓力
 
2.分頁查詢,當limit起點較高時,可先用過濾條件進行過濾。如select f1,f2,f3 from table1 limit 20000,20;優化爲: select f1,f2,f3 from table1 where id>20000 limit 20
 
3.where條件裏等號左右字段類型一致,不然沒法利用索引
 
4.在多表join中,儘可能選取結果集較小的表做爲驅動表,來join其餘表
 
5.插入列列表與值列表個數相同,上面兩者的個數須要相同,若是沒有指定列列表,則值列表長度要與表列數相同。
 
6.更新刪除影響行數不要太大,若是太大,進行細粒度拆分
 
7.更新,刪除語句記得隨手寫好where條件(你想刪庫嗎?哈哈)
 

歡迎你們補充,一塊兒創建更優雅的數據規範

相關文章
相關標籤/搜索