天天看點

趕集mysql軍規

一,核心軍規

  • 不在資料庫做計算,cpu計算務必移至業務層
  • 控制單表資料量,單表記錄控制在千萬級
  • 控制列數量,字段數控制在20以内
  • 平衡範式與備援,為提高效率可以犧牲範式設計,備援資料
  • 拒絕3B(big),大sql,大事務,大批量

二,字段類軍規

  • 用好數值類型
tinyint(1Byte)
smallint(2Byte)
mediumint(3Byte)
int(4Byte)
bigint(8Byte)
bad case:int(1)/int(11)           
  • 有些字元轉化為數字

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

  • 優先使用enum或set

    例如:

    sex

    enum (‘F’, ‘M’)
  • 避免使用NULL字段

    NULL字段很難查詢優化

NULL字段的索引需要額外空間

NULL字段的複合索引無效

bad case:
`name` char(32) default null
`age` int not null
good case:
`age` int not null default 0           
  • 不在資料庫裡存圖檔

三,索引類軍規

  • 謹慎合理使用索引

    改善查詢、減慢更新

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

覆寫記錄條數過多不适合建索引,例如“性别”

  • 字元字段必須建字首索引
  • 不在索引做列運算
  1. case:

select id where age +1 = 10;

  • innodb主鍵合理使用自增列

    主鍵建立聚簇索引

主鍵不應該被修改

字元串不應該做主鍵

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

  • 不用外鍵,請由程式保證限制

四,sql類軍規

sql語句盡可能簡單

一條sql隻能在一個cpu運算

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

一條大sql可以堵死整個庫

簡單的事務

事務時間盡可能短

bad case:

上傳圖檔事務

避免使用觸發器,使用者自定義函數,請由程式取而代之

不用select *

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

這種程式不具有擴充性

OR改寫為IN()

OR改寫為UNION

畫外音:最新的mysql核心已經進行了相關優化

  • limit高效分頁

    limit越大,效率越低

select id from t limit 10000, 10;

應該改為 =>

select id from t where id > 10000 limit 10;

  • 使用union all替代union,union有去重開銷
  • 盡量不用連接配接join
  • 務必請使用“同類型”進行比較,否則可能全表掃面
  • 打散批量更新
  • 使用新能分析工具
show profile;
mysqlsla;
mysqldumpslow;
explain;
show slow log;
show processlist;
show query_response_time(percona)