[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語句