MySQL 資料庫開發的 36 條軍規

2021-07-02 01:07:46 字數 2531 閱讀 9581

mysql 資料庫開發的 36 條軍規

寫在前面的話:

總是在災難發生後,才想起容災的重要性;

總是在吃過虧後,才記得曾經有人提醒過。

(一)核心軍規

(1)不在資料庫做運算

:cpu計算務必移至業務層

(2)控制單錶資料量:

單錶記錄控制在1000w

(3)控制列數量:

字段數控制在20以內

(4)平衡正規化與冗餘:為提高效率犧牲正規化設計,冗餘資料

(5)拒絕3b:

拒絕大sql,大事物,大批量

(二)欄位類軍規

(6)用好數值型別

tinyint(1byte)

smallint(2byte)

mediumint(3byte)

int(4byte)

bigint(8byte)

bad case:int(1)/int(11)

(7)字元轉化為數字

用int而不是char(15)儲存ip

(8)優先使用enum或set

例如:`***` enum (『f』, 『m』)

(9)避免使用null欄位

null欄位很難查詢優化

null欄位的索引需要額外空間

null欄位的復合索引無效

bad case:

`name` char(32) default null

`age` int not null

good case:

`age` int not null default 0

(10)少用text/blob

varchar的效能會比text高很多

實在避免不了blob,請拆表

(11)不在資料庫裡存:是否需要解釋?

(三)索引類軍規

(12)謹慎合理使用索引

改善查詢、減慢更新

索引一定不是越多越好(能不加就不加,要加的一定得加)

覆蓋記錄條數過多不適合建索引,例如「性別」

(13)字元字段必須建字首索引

(14)不在索引做列運算

bad case:

select id where age +1 = 10;

(15)innodb主鍵推薦使用自增列(sk:博主不認可)

主鍵建立聚簇索引

主鍵不應該被修改

字串不應該做主鍵

如果不指定主鍵,innodb會使用唯一且非空值索引代替

(16)不用外來鍵

請由程式保證約束

(四)sql類軍規

(17)sql語句盡可能簡單

一條sql只能在乙個cpu運算

大語句拆小語句,減少鎖時間

一條大sql可以堵死整個庫

(18)簡單的事務

事務時間盡可能短

bad case:

上傳事務

(19)避免使用trig/func

觸發器、函式不用

客戶端程式取而代之

(20)不用select *

消耗cpu,io,記憶體,頻寬

這種程式不具有擴充套件性

(21)or改寫為in()

or的效率是n級別

in的訊息時log(n)級別

in的個數建議控制在200以內

select id from t where phone=』159′ or phone=』136′;

=>

select id from t where phone in (』159′, 』136′);

(22)or改寫為union

mysql的索引合併很弱智

select id from t where phone = 』159′ or name = 『john』;

=>

select id from t where phone=』159′

union

select id from t where name=』jonh』

(23)避免負向%

(24)慎用count(*)

(25)同上

(26)limit高效分頁

limit越大,效率越低

select id from t limit 10000, 10;

=>

select id from t where id > 10000 limit 10;

(27)使用union all替代union

union有去重開銷

(28)少用連線join

(29)使用group by

分組自動排序

(30)請使用同型別比較

(31)使用load data導資料

load data比insert快約20倍;

(32)打散批量更新

(33)新能分析工具

show profile;

mysqlsla;

mysqldumpslow;

explain;

show slow log;

show processlist;

show query_response_time(percona)

Mysql資料庫開發36條軍規

盡量不在資料庫做運算 控制單錶資料量 保持表身段苗條 平衡正規化與冗餘 拒絕3b 大sql 大事物 大批量 用好數值字段型別 將字元轉化為數字 優先使用enum或set 避免使用null欄位 少用並拆分text blob 不在資料庫裡存放 謹慎合理新增索引 字元字段必須建立字首索引 不在索引列做運算...

MySQL資料庫開發的 36 條軍規

來自一線的實戰經驗,主要針對dba和後端開發人員,總是在災難發生後,才想起容災的重要性 總是在吃過虧後,才記得曾經有人提醒過。核心軍規 盡量不在資料庫做運算 控制單錶資料量 純int不超過10m條,含char不超過5m條 保持表身段苗條 平衡正規化和冗餘 拒絕大sql,複雜事務,大批量任務 欄位類軍...

MySQL資料庫開發的 36 條軍規!

一 核心軍規 盡量不在資料庫做運算 控制單錶資料量 純int不超過10m條,含char不超過5m條 保持表身段苗條 平衡正規化和冗餘 拒絕大sql,複雜事務,大批量任務 二 欄位類軍規 用好數值字段,盡量簡化字段位數 把字元轉化為數字 優先使用enum或set 避免使用null欄位 少用並拆封tex...