Mysql開發規範

[TOC]sql

#Mysql開發規範數據庫

##命名規範函數

  • 庫名、表名、字段名必須使用小寫字母,並採用下劃線分割
  • 庫名、表名、字段名禁止超過32字字符。須見名之意
  • 庫名、表名、字段名禁止使用Mysql保留字
  • 臨時庫、表名必須以tmp爲前綴,並以日期爲後綴
  • 備份庫、表名必須以bak爲前綴,並以日期爲後綴
create table user ...
tmp_user_20160606
bak_user_20160606

##基礎規範測試

  • 使用innodb存儲引擎
  • 表字符集使用utf-8
  • 全部表必須添加註釋
  • 單表數據量控制在5000w之內
  • 不在數據庫中存儲圖片、文件等大數據
  • 禁止在線上作數據庫壓力測試

##庫表設計大數據

  • 禁止使用分區表
  • 拆分大字段和訪問頻率低的字段,分離冷熱數據
  • 用hash進行散表,表名後綴使用十進制數,下標從0開始
  • 按日期時間分表需符合YYYY[MM][DD][HH]格式
  • 採用合適的分庫分表策略。例如十庫百表等

##字段設計設計

  • 全部字段均定義爲not null
  • 儘可能不使用TEXT、BLOB類型
  • 使用decimal代替float和double存儲精確浮點數
  • 使用tinyint代替enum類型
  • 使用unsigned存儲非負整數
  • 使用timestamp存儲時間
  • 使用int存儲時間戳
  • 使用int存儲ip
  • 禁止在數據庫存儲明文密碼

##索引規範code

  • 單張表索引數量不超過5個
  • 單個索引中的字段數不超過5個
  • 前綴索引長度不超過8個字符
  • 區分度最大的字段放在前面。如:聯合索引
  • 儘可能不選擇字符串列
  • 不使用外鍵
  • 不使用更新頻繁的列
  • 不使用UUID MD5 HASH
  • 不使用%前導的查詢,如like "%ab"
  • 不使用負向查詢,如not in/like
  • 不在低基數列上創建索引,例如:性別
  • 不在索引列進行數學運算和函數運算

##SQL設計索引

  • 充分利用前綴索引,例如:最左前綴
  • 不使用select *
  • 不能同時用到兩個範圍條件
  • 不使用存儲過程、觸發器、視圖等
  • 不使用大表join
  • 不使用數學運算和邏輯判斷
  • 不使用order by rand()
  • 不使用單條sql語句同時更新多個表
  • 多使用insert ... on duplicate key update
  • 多使用replace into、insert ignore、insert into values(),(),()
  • 多使用update ... where id in(10,20,50,...)
  • 使用in代替or, in的值不超過1000個
  • 使用explain診斷,避免生成臨時表
  • 使用union all而不是union
###good
select * from profiles where sex='M' order by rating limit 10;
select * from profiles inner join (select <pk> from profiles where x.sex='M'
order by rating limit 100000,10) as x using (<pk>);
###bad
select * from profiles where sex='M' order by rating limit 100000,10;

##行爲規範圖片

  • 禁止有super權限的應用程序帳號存在
  • 不在業務高峯其期批量更新、查詢數據庫
  • 提交線上建表改表需求,必須詳細註明全部相關sql語句
相關文章
相關標籤/搜索