MYSQL數據庫設計規範與原則

  1. MYSQL數據庫設計規範  
  2.    
  3.     一、數據庫命名規範  
  4.         採用26個英文字母(區分大小寫)和0-9的天然數(常常不須要)加上下劃線'_'組成;  
  5.         命名簡潔明確(長度不能超過30個字符);  
  6.         例如:user, stat, log, 也能夠wifi_user, wifi_stat, wifi_log給數據庫加個前綴;  
  7.         除非是備份數據庫能夠加0-9的天然數:user_db_20151210;  
  8.            
  9.     二、數據庫表名命名規範  
  10.         採用26個英文字母(區分大小寫)和0-9的天然數(常常不須要)加上下劃線'_'組成;  
  11.         命名簡潔明確,多個單詞用下劃線'_'分隔;  
  12.         例如:user_login, user_profile, user_detail, user_role, user_role_relation,  
  13.             user_role_right, user_role_right_relation  
  14.         表前綴'user_'能夠有效的把相同關係的表顯示在一塊兒;  
  15.            
  16.     三、數據庫表字段名命名規範  
  17.         採用26個英文字母(區分大小寫)和0-9的天然數(常常不須要)加上下劃線'_'組成;  
  18.         命名簡潔明確,多個單詞用下劃線'_'分隔;  
  19.         例如:user_login表字段 user_id, user_name, pass_word, eamil, tickit, status, mobile, add_time;  
  20.         每一個表中必須有自增主鍵,add_time(默認系統時間)  
  21.         表與表之間的相關聯字段名稱要求儘量的相同;  
  22.        
  23.     四、數據庫表字段類型規範  
  24.         用盡可能少的存儲空間來存數一個字段的數據;  
  25.         例如:能使用int就不要使用varchar、char,能用varchar(16)就不要使用varchar(256);  
  26.         IP地址最好使用int類型;  
  27.         固定長度的類型最好使用char,例如:郵編;  
  28.         能使用tinyint就不要使用smallint,int;  
  29.         最好給每一個字段一個默認值,最好不能爲null;  
  30.        
  31.     五、數據庫表索引規範  
  32.         命名簡潔明確,例如:user_login表user_name字段的索引應爲user_name_index惟一索引;  
  33.         爲每一個表建立一個主鍵索引;  
  34.         爲每一個表建立合理的索引;  
  35.         創建複合索引請慎重;  
  36.            
  37.     六、簡單熟悉數據庫範式  
  38.         第一範式(1NF):字段值具備原子性,不能再分(全部關係型數據庫系統都知足第一範式);  
  39.             例如:姓名字段,其中姓和名是一個總體,若是區分姓和名那麼必須設立兩個獨立字段;  
  40.            
  41.         第二範式(2NF):一個表必須有主鍵,即每行數據都能被惟一的區分;  
  42.             備註:必須先知足第一範式;  
  43.            
  44.         第三範式(3NF):一個表中不能包涵其餘相關表中非關鍵字段的信息,即數據表不能有沉餘字段;  
  45.             備註:必須先知足第二範式;  
  46.            
  47.         備註:每每咱們在設計表中不能遵照第三範式,由於合理的沉餘字段將會給咱們減小join的查詢;  
  48.               例如:相冊表中會添加圖片的點擊數字段,在相冊圖片表中也會添加圖片的點擊數字段;  
  49.                  
  50.    
  51.        
  52. MYSQL數據庫設計原則  
  53.    
  54.     一、核心原則  
  55.         不在數據庫作運算;  
  56.         cpu計算務必移至業務層;  
  57.         控制列數量(字段少而精,字段數建議在20之內);  
  58.         平衡範式與冗餘(效率優先;每每犧牲範式)  
  59.         拒絕3B(拒絕大sql語句:big sql、拒絕大事物:big transaction、拒絕大批量:big batch);  
  60.    
  61.     二、字段類原則  
  62.         用好數值類型(用合適的字段類型節約空間);  
  63.         字符轉化爲數字(能轉化的最好轉化,一樣節約空間、提升查詢性能);  
  64.         避免使用NULL字段(NULL字段很難查詢優化、NULL字段的索引須要額外空間、NULL字段的複合索引無效);  
  65.         少用text類型(儘可能使用varchar代替text字段);  
  66.        
  67.     三、索引類原則  
  68.         合理使用索引(改善查詢,減慢更新,索引必定不是越多越好);  
  69.         字符字段必須建前綴索引;  
  70.         不在索引作列運算;  
  71.         innodb主鍵推薦使用自增列(主鍵創建聚簇索引,主鍵不該該被修改,字符串不該該作主鍵)(理解Innodb的索引保存結構就知道了);  
  72.         不用外鍵(由程序保證約束);  
  73.        
  74.     四、sql類原則  
  75.         sql語句儘量簡單(一條sql只能在一個cpu運算,大語句拆小語句,減小鎖時間,一條大sql能夠堵死整個庫);  
  76.         簡單的事務;  
  77.         避免使用trig/func(觸發器、函數不用客戶端程序取而代之);  
  78.         不用select *(消耗cpu,io,內存,帶寬,這種程序不具備擴展性);  
  79.         OR改寫爲IN(or的效率是n級別);  
  80.         OR改寫爲UNION(mysql的索引合併很弱智);  
  81.             select id from t where phone = ’159′ or name = ‘john’;  
  82.             =>  
  83.             select id from t where phone=’159′  
  84.             union  
  85.             select id from t where name=’jonh’  
  86.         避免負向%;  
  87.         慎用count(*);  
  88.         limit高效分頁(limit越大,效率越低);  
  89.         使用union all替代union(union有去重開銷);  
  90.         少用鏈接join;  
  91.         使用group by;  
  92.         請使用同類型比較;  
  93.         打散批量更新;  
  94.            
  95.     五、性能分析工具  
  96.         show profile;  
  97.         mysqlsla;  
  98.         mysqldumpslow;  
  99.         explain;  
  100.         show slow log;  
  101.         show processlist; 
相關文章
相關標籤/搜索