一:新建表和欄位建議:
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條件(你想刪庫嗎?哈哈)歡迎大家補充,一起建立更優雅的資料規范
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/37875.html
標籤:MySQL
上一篇:珍藏的資料庫SQL基礎練習題答案
