概述
本文介紹如何玩轉 MySQL, 可以說是 MySQL 開發規範, 也可以理解爲 MySQL 最佳實戰.
一、基礎規範
- 使用 InnoDB 存儲引擎
- 數據庫字符集使用 UTF8,校對字符集使用 utf8_general_ci
- 所有 表 、字段 都儘量 添加註釋
- 庫名、表名、字段名 使用 小寫字母,禁止
超過32個字符,須見名知意 - 非唯一索引 以 “idx_字段1_字段2” 命名,唯一索引 必須以 “uniq_字段1_字段2” 命名
二、查詢規範
- SQL 語句儘可能簡單,大的 SQL 想辦法 拆分 成小的 SQL 實現
*不要使用SELECT **,查詢具體要用到的字段禁止 like 做 where 條件(會全表掃描且不能用索引)- 除非必要,
避免使用 != 等非等值操作符(會導致用不到索引) Where 條件裏不要對列使用函數(不會引用索引)- 能確定返回結果只有一條時,使用limit 1 (LIMIT分頁注意效率,LIMIT越大,效率越低)
- 少用 子查詢,改用 JOIN(子查詢要在內存裏建臨時表)
- 多表 JOIN 的字段,區分度最大的字段放在前面
- IN 條件裏的 數據數量要儘量少,超過200 個用 EXIST 代替 IN
- Where 字句中同一個表的 不同字段組合 建議 小於5組 (否則考慮分表)
禁止單條語句同時更新多個表- 事務要儘量簡單,整個事務的時間長度不要太長
三、表設計規範
- 用 DECIMAL 代替 FLOAT 和 DOUBLE 存儲精確浮點數(精確數據)
- 使用 TINYINT 代替 ENUM 類型(便於遷移時兼容)
儘可能不使用 TEXT、BLOB 類型(該數據類型不能設置默認值、不便於排序、不便於建立索引)- 同一意義的字段設計定義必須相同(便於聯表查詢)
- 所有字段 均定義爲 NOT NULL(避免使用NULL字段,NULL字段很難查詢優化,NULL字段的索引需要額外空間,NULL字段的複合索引無效)
- 表必須有主鍵,
不使用更新頻繁的列做主鍵、儘量不使用字符串列做主鍵,儘量使用非空的唯一自增鍵做主鍵
四、索引設計規範
- 單表索引數量不超過10個
- 單個字段不要超過兩個索引
- 新建的唯一索引必須不能和主鍵重複
- 避免冗餘和重複索引
- 儘量不要在頻繁更新的列上建立索引
- 不在低基數列上建立索引,例如狀態、類型等
- 不在索引列進行數學運算和函數運算(參與了運算的列不會引用索引)
- 複合索引須符合最左前綴的特點建立索引(mysql使用複合索引時從左向右匹配)
- 重要的 SQL 中 where 條件裏的字段必須被索引
- Where 條件裏的 字段順序 與 索引順序 無關,優化器會自動調整
- 索引選擇性 = Cardinality / Total Rows,即基數 ÷ 數據行數,值越接近1說明使用索引的過濾效果越好
- 建立索引時,務必先explain,查看索引使用情況
最佳實踐
666 彩蛋
剛開始寫博客, 希望大家支持, 如果有沒疑問或不清楚的地方可以留言噢!
下週再見~