命名問題
所有關鍵字是小寫加下劃線
因為區分大小寫,是以如DbName,dbname是兩個不同的命名,是以在程式設計中統一用小寫字母加下劃線有助于避免開發時費神區分一些命名的情況。
禁用MySQL關鍵字
見名識意,最好不要超過32字元
臨時表tmp ,備份表bak(字尾為日期)
關聯id的名稱類型最好為一樣(為了避免查詢時做隐式的類型轉換)
設計規範:
Innodb存儲引擎:5.6以後預設引擎,支援事務\行級鎖,更好的恢複性,高并發下性能更好。
UTF-8字元集。
表和字段添加注釋。
單表資料量盡量控制在500w以内(歸檔-日志表)。
盡量做到冷熱分離(分列)。
禁止存儲圖檔,檔案等二進制資料
索引
單張表索引不要超過5個。
每個Innodb表必須有一個主鍵
不使用更新頻繁的列作為主鍵,不使用多列主鍵。
不使用UUID, MD5, HASH,字元串列作為主鍵。
建議自動ID增
常見索引列建議:
select, update, delete語句的where從句中的列
包含在order by,group by ,distinct中的字段
多表join的關聯列
避免備援和重複索引
外鍵最好在業務端實作
避免TEXT、BLOB資料類型(拆分到單獨表中)
避免用enum資料類型(會降低效率)
盡量定義為NOT NULL(比較和計算時)
用TIMESTAMP或DATETIME存儲時間
财務相關用decimal存儲(float和double是非精确的)
開發規範
使用預編譯而不是動态sql
避免資料類型隐式轉換
充分利用表上已經存在的索引:
避免使用雙%的查詢條件,一個SQL隻能利用到符合索引中的一列進行範圍查詢。
程式連接配接不同的資料使用不同的賬号,禁止跨庫查詢:
為資料庫遷移和分庫分表留出餘地。
降低業務耦合度。
避免權限過大而産生的安全風險
禁止用select *
消耗更多的CPU和IO以及網絡帶寬資源
無法使用覆寫索引
可減少表結構變更帶來的影響
禁止使用不含字段清單的INSERT語句
将子查詢優化為join操作
避免使用JOIN關聯太多的表(建議不超過5個)
減少同資料庫的互動次數
禁止order by rand():推薦在程式中擷取一些随機值
where 從句中禁止對列進行函數轉換
第三範式:不存在傳遞關系。(隻有兩級)