mysql數據庫設計規範和優化

數據庫的設計

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 權限
 

58到家數據庫30條軍規解讀 https://www.jianshu.com/p/f634b5915872

優化方面 

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)執行時以最左邊的表爲基礎表循環與右邊表數據做笛卡爾積

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章