系統性能優化總結之持久層篇(3)

最後一篇是關於持久層的性能優化,和dba的關係比較密切,我認爲持久層優化的主要原則是:減少表關聯查詢。即使必須要有關聯查詢,也要減少關聯的表的個數。根據經驗,大多數的應用,性能瓶頸都在數據庫這邊,我們圍繞上面的原則,可有下面的一些辦法來進行優化。

  • 增 加表冗餘字段。這種方法會使你的表不符合範式要求,但是我們必須知道,範式僅僅是理論上的,也就是建議你的表設計的一個標準,恐怕嚴格符合第四範式的項目 不能滿足非功能性需求。我們在進行er設計的時候,可根據項目實際需求,在某些表中加入冗餘字段,前提是這些冗餘字段不會經常變化,如果變化過快,將會給 數據同步更新帶來麻煩。
  • 增加數據庫索引。在對系統上線一段時間後跟蹤的sql進行歸類統計,按表、按where字段排序,找出一張表中最常做爲查詢條件的字段,在這些字段上建立索引,一般一張表可以建很多個索引,對查詢性能的提升,效果是非常明顯的。
  • 分表。設計前要預估算出一張表的最大記錄行數,考慮是否要進行分表設計(我的其它文章中會專門講到)。
  • 對 表進行水平和垂直分區。設計前要預估算出一張表的最大記錄行數,以決定是否會對該表數據分區。根據我的經驗,一般一張表的數據量達到10萬條以上,就可以 考慮分區了。分區類型有很多種,要根據項目情況考慮,mysql是在5.15中才加入分區功能的,使用mysql的同學要注意哦。
  • 數 據文件物理存儲問題。在進行建表或建分區時,都可以選擇文件的物理存儲路徑,因爲服務器一般都有多塊磁盤,那我們就一定要注意,根據表的訪問題情況,利用 單獨磁盤的I/O,合理的分配到物理磁盤上去,提高效率。如果只有一塊盤,可考慮將存儲文件劃分到不同邏輯分區上去,邏輯分區在物理扇區上是連續分配的, 對效率提升有好處。
  • 數據庫集羣。一般數據庫都是支持集羣功能的,配置集羣,水平擴展數據庫的性能。
  • 採用讀寫分離。我曾經幫朋友設計過的一個高併發系統,數據庫採用mysql實現,就採用了讀、寫分離機制,這個也是許多高併發網站常用的方法。
  • 程序員寫程序的時候要注意,可儘量使用一些特有數據庫的專用語句,對性能提升是有好處的,缺點是不便於數據庫的更改移植。
  • 程序員要儘量避免行級鎖,程序中儘可能用樂觀鎖或離線鎖。
  • 可 將有些大數據量的sql操作寫到存儲過程中去,因爲存儲過程都是經過編譯的,執行效率非常的高,我們的一些早期項目都用這個來做複雜的大數據量業務操作。 缺點也很明顯,一是數據庫平臺更換與移植,另一個就是性能優化時無法水平提升系統性能,比如:應用服務器做了集羣,但數據庫這邊的存儲過程仍然是瓶頸。
  • 最後一點是設計上的,原理是數據庫刪除效率不高,那我們就少用刪除。平進的刪除,只是對數據庫打上刪除標誌,在非系統高峯期,用定時任務真正刪除打了標記的數據,這種做法在移動、電信的項目中比較常見。

性能優化需要在實踐中不斷總結積累,上面的一些是我這些年來的實踐所總結,談不上全面與深刻,我也相信,每個人都有自己的一套獨門絕技,歡迎補充完善。

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