mysql5.7
mysql SQLyog
Linux Shell腳本mysql
用戶登陸-選購商品-加購物車-檢查庫存-提交訂單-貨到付款-訂單付款-發貨sql
用戶模塊 用戶註冊登陸驗證
商品模塊 先後臺商品管理
訂單模塊 訂單購物車生成和管理
倉配模塊 倉庫庫存和物流的管理數據庫
邏輯設計-物理設計
實際工做中 邏輯設計+物理設計
表名 字段名 字段類型網絡
數據庫字段設計規範
-數據庫對象名稱必須使用小寫字段 下劃線分隔 DbName not Equal dbname併發
-數據庫對象禁止使用mysql保留關鍵字
select id,username,from,age from tb_user 報錯
select id,username,from
,age from tb_user 不報錯數據庫設計
-數據庫對象命名見名識意 不超過32字符 用戶數據庫mc_userdb 用戶數據表user_account函數
-全部臨時表以tmp爲前綴而且以日期爲後綴高併發
-備份庫 備份表必須以bak爲前綴並以日期爲後綴性能
-全部儲存相同數據的列名和列類型必須一致測試
-全部表是使用Innodb存儲引擎 支持事務 行級鎖 更好的恢復性 高併發下性能好
-數據庫和表的字符集統一使用UTF8
統一字符集能夠避免因爲字符集轉換成的亂碼
-使用comment從句添加表和列的註釋 數據字典的維護
-控制單表數據量的大小 控制在500w行內
-限制取決於存儲設置和文件系統
-分區表在物理上表現爲多個文件 邏輯上爲一個表
-謹慎選擇分區鍵 跨分區效率更低 物理分表方式管理大數據
-禁止表中使用預留字段
-禁止在數據庫中存儲圖片 文件等二進制數據
-禁止線上作數據庫壓力測試
-禁止開發測試環境鏈接生成環境數據庫
索引設計規範
-限制表索引數量 建議單張表索引不超過5個
-每一個Innodb表必須有一個主鍵 不能使用頻繁更新的列做爲主鍵
-不使用UUID MD5 HASH 字符串做爲主鍵
-SELECT UPDATE DELETE語句的WHERE從句中的列包含在ORDER BY,GROUP BY,DISTINCT中的字段多表的關聯列
-避免創建冗餘索引和重複
-對於頻繁查詢優先考慮覆蓋索引
-盡力避免使用外鍵
-外鍵用於保障數據參照完整性 建議在業務端實現
數據庫字段設計規範
-優先選擇符合存儲須要的最小的數據類型
-將字符串轉換爲數字類型存儲
INET_ATON('255.255.255.255') = 4294967295
INET_NTOA(4294967295) = '255.255.255.255'
(字符串須要15個字節 int只須要4個字節)
-對於非負數數據採用無符號整型進行存儲
SIGNED INT -2147483648~2147483648
UNSIGNED INT 0~4213213123
-VARCHAR(N) 中的N表明的是字符數 不是字節數
使用UTF-8存儲漢字 Varchar(255) = 765個字節
-避免TEXT BLOG類型數據
-避免使用ENUM數據類型 (修改用ALTER )
-儘量把全部列定義爲NOT NULL (索引NULL須要增長額外空間)
-使用TIMESTAMP或者DATETIME存儲時間
TIMESTAMP 1970-01-01 00:00:01 ~ 2038-01-19 03:14:07
超出時間用DATETIME
-數據類型
財務相關 decimal類型 計算時不會丟失精度
數據庫SQL開發規範
-充分利用表上已有的索引 避免使用雙%號的查詢條件 如:a like '%123%'
-一個sql只能利用到複合索引中的一列進行範圍查詢
-使用left join或者not exist優化not in操做
-設計時 對之後的數據庫擴展考慮
-程序鏈接不一樣的數據庫
-爲數據庫遷移和分庫分表留餘地
-禁止使用SELECT * 必須使用 SELCT <字段列表查詢> (會消耗更多的CPU和IO以及網絡帶寬資源) 能夠減小表結構表化的影響
-禁止使用不含字段列表的INSERT語句
INSERT into t values('a','b','c');
INSERT into t(c1,c2,c3) values('a','b','c');
能夠減小表結構表化的影響
-避免使用子查詢 能夠把子查詢優化爲join查詢(子查詢結果集沒法使用索引)
子查詢會產生臨時表操做 子查詢數據量大會嚴重影響效率
-避免使用join關聯太多表 不要超過5個
-減小同數據的交互次數
數據庫更適合批量操做
合併多個相同的操做到一塊兒 能夠提升處理效率
alter table t1 add column c1 int,change column c2 c2 int
-使用in代替or
-禁止使用order by rand()隨機排序
會把表中符合條件的數據裝載到內存中排序 消耗大量CPU
推薦程序中獲取隨機值 而後從數據中獲取
-where從句中禁止對列進行函數轉換和計算
where date(createtime)= '20160901' 會沒法使用索引
改成where createtime >= 20160901 and createtime < '20160902'
-明顯不會有重複值時使用UNION ALL而不是UNION
union會把全部數據放到臨時表中再操做 會去重操做
union all不會再對結果集從新操做
-拆分複雜的大sql爲小sql
數據庫操做行爲規範
-超過100w行的批量寫操做 要分批屢次操做
大批量操做可能會形成嚴重主從延遲
避免產生大量日誌
-對於大表使用pt-online-schema-change修改表結構
-禁止爲程序使用的帳號使用super
-程序使用帳號只能在一個DB上使用 原則上不能有drop權限