一、基礎規範
1) 使用innodb儲存引擎
2) 資料庫字符集使用utf8,校對字符集使用utf8_general_ci
3) 所有表、欄位都盡量新增注釋
4) 庫名、表名、欄位名使用小寫字母,禁止超過32個字元,須見名知意
5) 非唯一索引以 「idx_欄位1_欄位2」 命名,唯一索引必須以 「uniq_欄位1_欄位2」 命名
二、查詢規範
1) sql語句盡可能簡單,大的sql想辦法拆分成小的sql實現
2) 不要使用select * ,查詢具體要用到的字段
3) 禁止like做where條件(會全表掃瞄且不能用索引)
4) 除非必要,避免使用 != 等非等值操作符(會導致用不到索引)
5) where條件裡不要對列使用函式(不會引用索引)
6) 能確定返回結果只有一條時,使用limit 1(limit分頁注意效率,limit越大,效率越低)
7) 少用子查詢,改用join(子查詢要在記憶體裡建臨時表)
8) 多表join的字段,區分度最大的字段放在前面
9) in條件裡的資料數量要盡量少,超過200個用exist代替in
10) where字句中同乙個表的不同字段組合建議小於5組(否則考慮分表)
11) 禁止單條語句同時更新多個表
12) 事務要盡量簡單,整個事務的時間長度不要太長
三、表設計規範
1) 用decimal代替float和double儲存精確浮點數(精確資料)
2) 使用tinyint代替enum型別(便於遷移時相容)
3) 盡可能不使用text、blob型別(該資料型別不能設定預設值、不便於排序、不便於建立索引)
4) 同一意義的字段設計定義必須相同(便於聯表查詢)
5) 所有欄位均定義為not null(避免使用null欄位,null欄位很難查詢優化,null欄位的索引需要額外空間,null欄位的復合索引無效)
6) 表必須有主鍵,不使用更新頻繁的列做主鍵、盡量不使用字串列做主鍵,盡量使用非空的唯一自增鍵做主鍵
四、索引設計規範
1) 單錶索參數量不超過10個
2) 單個字段不要超過兩個索引
3) 新建的唯一索引必須不能和主鍵重複
4) 避免冗餘和重複索引
5) 盡量不要在頻繁更新的列上建立索引
6) 不在低基數列上建立索引,例如狀態、型別等
7) 不在索引列進行數**算和函式運算(參與了運算的列不會引用索引)
8) 復合索引須符合最左字首的特點建立索引(mysql使用復合索引時從左向右匹配)
9) 重要的sql中where條件裡的字段必須被索引
10) where條件裡的字段順序與索引順序無關,優化器會自動調整
11) 索引選擇性= cardinality / total rows,即基數 ÷ 資料行數,值越接近1說明使用索引的過濾效果越好
12) 建立索引時,務必先explain,檢視索引使用情況
MySQL預設值約束
1 預設值約束 特點 1 乙個表可以有很多的預設值約束 2 預設值約束只能針對某乙個字段來說 3 預設值約束意味著,該欄位如果沒有手動賦值,會按預設值處理 2 如何在建表時指定預設值約束?create table 資料庫名.表名稱 欄位名1 資料型別 primary key,欄位名2 資料型別 un...
mysql 筆記 預設值
1 指定列的預設值 columnname int default 1 2 integer 列 設定自增列 也是指定預設值的方式 3 預設值必須是常量 不能使用函式 表示式 特例 timestamp datetime 列可以指定current timestamp做為預設值 4 blob text ge...
oracle設定預設值無效
一次做農行的專案,在向乙個表插入資料時我們要求插入字元型別的操作日期和時間,我們這邊當時採取的是給日期和時間字段設定預設值的方法 下面我簡單還原一下當時的表結構 create table create table test date time id integer operdate varchar2...