數據庫的設計
1、數據庫命名規範
•所有的數據庫對象名稱必須使用小寫字母並使用下劃線分割(mysql 數據庫對大小寫敏感)
•所有數據庫對象名稱禁止使用MySqL保留關鍵字 eg. from關鍵字
•數據庫對象的命名要見名之意 , 最好不要超過32個字符.
•數據庫操作的時候 ,總會導入導出表 , 有一些臨時表 , 臨時表的最好以tmp爲前綴並且以日期爲後綴
•備份表的命名, 最好以bak爲前綴並且以日期爲後綴
•所有存儲相同數據的列名和列類型必須一致
2、數據結構基本設計規範
•所有的表必須使用Innodb存儲引擎
•數據庫和標的字符集統一使用UTF-8 utf8-mb4
•所有的表和字段都要添加註釋
•儘量控制單表數據量的大小 , 儘量在500萬行以內
•儘量做到冷熱數據分離,減小表的寬度
•禁止在表中建立預留字段
•禁止在數據庫中存儲圖片, 文件等二進制數據
•禁止在線上數據庫做數據庫壓力測試 dev test 預發 pre
•禁止從開發環境,測試環境直連生產環境數據庫
3、數據庫索引設計規範
•限制每張表的上的索引數量 , 建議單張表索引不超過 5 個
•Innodb是按照主鍵的順序來組織表的
•不使用更新頻繁的列作爲主鍵 , 不使用多列主鍵
•不使用UUID , MD5 , HASH , 字符串列作爲主鍵
•主鍵建議使用自增ID使用主鍵
•
•常見索引列建議
•select ,update , delete 語句中的where 從句中的列
•包含在order by ,group by ,distinct 中的字段
•多表JOIN的關聯列
•
•如何選擇索引列的順序
•區分度最高的列放在聯合索引的最左側(主鍵, 唯一索引列)
•儘量把字段長度最小的列放在聯合索引的最左側
•使用頻繁的列放到最左側
4、數據字段設計規範
•優先選擇符合存儲需要的最小的數據類型 手機號使用char
•避免使用 TEXT , BLOB數據類型
•避免使用 ENUM數據類型
•儘可能把列定義爲 NOT NULL
•使用 timestamp 或者datetime 類型存儲時間
•同財務相關的金額類數據 , 必須使用 decimal 類型
5、數據庫SQL開發規範
•充分使用表已經存在的索引查詢
•禁止使用 select * 查詢
•禁止使用不含字段列表的 insert 語句
•避免使用子查詢 , 可以把子查詢優化 join 操作
•避免使用 join 關聯太多的表,建議不超過 5 個
•減少同數據庫的交互次數,使用 in 代替 or
•禁止使用 order by rand () 進行隨機排序
•確定不會有重複值時 使用 union all 而不是 union
•拆分複雜的大 sql 爲多個 小 sql
6、數據庫操作行爲規範
•超過 100 萬行的批量寫操作 ,要 分批分次進行操作
•禁止爲程序使用的賬號賦予super 權限
•對於程序連接數據庫賬號 , 遵循權限最小原則
•程序使用數據庫賬號只能在一個DB下使用 , 不準跨庫
•程序使用的賬號原則上不準有 drop 權限
優化方面
1.存儲引擎
sql慢查詢的定位
show variables like 'slow_query_log'
set global slow_query_log =on
set global slow_query_log_file='/var/tmp/mysql/xxx-slow.log'
set global_queries_not_useing_indexes=on
set gloal_query_time=0.1(秒)
Time:日誌記錄時間
User@host: 執行的用戶及主機
Query_time:查詢耗費時間 Lock_time 鎖表時間 Rows_sent 發送給請求放的記錄條數
Rows_examined: 語句掃描的記錄條數
Set timestamp :語句執行的時間點
select ..... 執行的具體語句
mysqldumslow --help
show profile工具
sql 執行計劃(explain)
table :對應的表
type:鏈接的類型(system,const,eq_ref,ref,range,index,all)
possible_keys:可能使用的索引
key:實際使用的索引
rows:預計掃描行數
extra:解析查詢的額外信息(using index,using where ,usring temporary,usring filesort)
常見sql優化
- sql的查詢一定要基於索引完成sql的結果集掃描
- 避免索引列使用函數或者運算,這樣會導致索引無效
- where字句中like%號,儘量防止右邊
- 使用索引掃描,聯合索引中的列從左往右,命中越多越好
- 儘可能使用SQL語句用到的索引完成排序,避免使用文件排序的方式
- 查詢有效的列信息即可,少用*代理列信息
- 永遠用小結果集驅動與大結果集
1)以小結果集驅動能減少循環次數,從而減少對被動驅動結果集的訪問,從而減少被驅動表的鎖定
2)執行時以最左邊的表爲基礎表循環與右邊表數據做笛卡爾積