MySQL架構設計談:從開發規範、選型、拆分到減壓(一)

本文大綱:MySQL數據庫開發規範MySQL高可用架構選型MySQL Sharding拆分利用NoSQL爲MySQL減壓一、MySQL數據庫開發規範

數據庫規範到底有多重要?有過初創公司經歷的朋友應該都深有體會。規範是數據庫運維的一個基石,能有效地減少數據庫出問題的概率,保障數據庫schema的合理設計並方便後續自動化的管理。

曾經我們花了大半年時間來做數據庫規範化的工作,例如制定數據庫開發指南、給程序員做培訓等,推進的時候也會遇到一些阻力。但規範之後運維質量會有一個質的提升,也增進了DBA的工作效率。

在開發規範方面,我們劃分爲開發規範和運維規範兩部分。

1、開發規範

表設計的規範:字段數量建議不超過20-50個做好數據評估,建議純INT不超過1500萬,含有CHAR的不要超過1000萬。字段類型在滿足需求條件下越小越好,儘量使用UNSIGNED存儲非負整數,因爲實際使用時候存儲負數的場景不多。將字符轉換成數字存儲。例如使用UNSIGNED INT存儲IPv4 地址而不是用CHAR(15) ,但這種方式只能存儲IPv4,存儲不了IPv6。另外可以考慮將日期轉化爲數字,如:from_unixtime()、unix_timestamp()。所有字段均定義爲NOT NULL,除非你真的想存儲null。

索引設計的規範:

1)所有表必須有顯式主鍵InnoDB表是以主鍵排序存儲的IOT表儘量使用短、自增的列做索引複製結構使用row格式,如果表有主鍵可以加速複製UNSIGNED INT自增列,也可以考慮BIGINTTINYINT做主鍵可能導致MySQL Crash類型轉換會導致查詢效率很低可用uuid_short()代替uuid(),轉成BIGINT存儲

2)合理地建立索引選擇區分度高的列作爲索引單個索引字段數不超過5,單表索引數量不超過5,避免冗餘索引建立的索引能覆蓋80%主要的查詢,不求全,解決問題的主要矛盾複合索引排序問題,多用explain去確認

SQL編寫規範:

1)避免在數據庫中進行大量計算任務大事務拆成多個事務,分批多次操作慎用text、blob大型字段,如要用考慮好拆分方案頻繁查詢的字典表考慮用Cache抗

2)優化join避免大表與大表之間的join,考慮讓小表去驅動大表join最多允許三表join,最好控制成兩表控制join後面where選擇的行數

3)注重where條件,多用EXPLAIN確認where條件的字段,儘量用區別度高的字段,這樣走索引的性能更好出現子查詢的SQL,先確認MySQL版本,利用explain確認執行計劃進行分頁優化;DML時候多個value合併

Schema Review:

1)字符集問題

表字符集選擇UTF8 ,如果需要存儲emoj表情,就改成UTF8mb4

2)Schema設計原則核心表字段數量儘可能地少,有大字段要考慮拆分適當考慮一些反範式的表設計,增加冗餘字段,減少JOIN資金字段考慮統一*100處理成整型,避免使用decimal浮點類型存儲日誌類型的表可以考慮按創建時間水平切割,定期歸檔歷史數據

3)Schema設計目標快速實現功能爲主,保證節省資源平衡業務技術各個方面,做好取捨不要在DB裏進行大計算,減少複雜操作

整體來說,這部分規範還是很容易遵守的,實現起來也沒有什麼難度,就能取得很好的效果。

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