数据库设计对性能的影响
生活随笔
收集整理的這篇文章主要介紹了
数据库设计对性能的影响
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
數據庫結構設計和數據庫優化呢,是我們后面幾張主要的內容,所以我們這里先簡單的看幾個和數據庫的設計,和SQL優化有關的對數據庫性能產生影響的一些易犯的錯誤,我們現在對如何高性能的數據庫設計,和SQL優化的方法呢,詳細的討論,我們在設計數據庫結構時呢,比較容易犯的第一個錯誤呢,就是對表進行過多的反范式化的設計,這就會造成表中列過多,雖然說MSYQL運行給一個表建立很多的列,但是由于MYSQL的架構是插件的原因,MYSQL服務器層和存儲引擎層,是分離的,MYSQL的存儲引擎,API工作時呢,需要把在服務器層和存儲引擎層之間,通過緩沖拷貝數據,在服務器層將緩沖的內容解析成各個列,這個操作過程成本是非常高的,特別是對于MYISAM變長結構,和Innodb的行結構呢,在進行解析時還必須進行轉換,這個轉換的成本就還依賴于列的數量,所以如果一個表的列太多,在使用這個表時呢,就會帶來額外CPU的消耗,所以大家在進行表設計的時候呢,一定要注意,不要把所有相關的列呢,放到一個表中,而是要按照范式化,適當的把表進行拆分,關于什么是范式化,后面有詳細的討論,在這里只要大家記錄一下,一個表如果有太多列的話,對性能產生很不好的影響,就可以了,而第二個易犯的錯誤呢,和上面的正好相反,就是對數據庫設計過分的使用了范式化的思路,對于任何查詢呢,都要關聯很多的表來完成,通過上面的計算呢,應該知道,在MYSQL中,進行表關聯的成本是很高的,而且性能呢也會隨著關聯表的增加而下降,所以MYSQL對于可關聯表的數量呢,進行了一個限制,MYSQL最多只能關聯一個表,這個限制雖然對于大多數應用來說,已經足夠了,但是我們為了MYSQL的性能呢,我們還是要盡量的減少,關聯的表,對于關聯表最好是關聯在10個以內,這就要求我們,在進行數據庫設計時呢,應當進行適當的反范式化的設計,把經常使用的兩個小表呢,合成一個大表,這樣對提升數據庫的性能,和查詢的性能都是很有幫助的,而第三個易犯的問題就是,OLTP環境中,錯誤的使用了分區表,分區表是個好東西,幫助我們把一個大表,從物理存儲上,按照分區鍵,分成多個小表,這里要注意,分區表和我們常說的分庫分表是有差別的,分區表是在同一個數據庫實例上所進行的,而在物理存儲上呢,分成了多個小表,但是在使用時呢,實際上還是一個表,而分庫分表呢,所要做的操作,不只是物理上對表進行了拆分,在邏輯上也會拆分多個表,而且分庫分表后呢,這多個表通常是不在同一個數據庫實例下的,在使用分區表時,分區鍵的選擇非常的關鍵,如果分區選擇的不好,就會造成查詢時呢,就會造成查詢時呢需要跨多個分區來進行查詢,這樣不僅不會提高數據庫的查詢性能,反而還會降低其性能,所以建議大家呢,在OLTP環境中呢,這個分區表一定要注意,分區表最好還是在OLTP環境中呢,來進行使用,或對于一些日志類的表,存儲中的使用還是比較合適的,那么最后一個易犯的錯誤呢,外鍵的使用,大家都知道,Innodb存儲引擎是事務的存儲引擎,它是支持事務和外鍵的,所以我見過很多開發人員,喜歡使用外鍵約束來保證數據的完整性,但是這樣的效率是非常低的,因為在對外鍵進行數據修改時,MYSQL都要對外鍵進行檢查,這樣就帶來額外的這種鎖的開銷,降低數據庫的修改的效率,另外使用外鍵來進行數據備份,恢復或手動進行數據庫歸檔,維護也會產生問題,比如我們不能使用truncate table這種語句呢,快速對于使用外鍵的表呢,進行清空操作,只能使用delete來進行,這樣在主從復制的情況下呢,對于一個大表的清理的復雜度呢,就會變得很高,所以強烈建議大家,不要使用外鍵約束,但是建立相關的索引還是必須的
?
總結
以上是生活随笔為你收集整理的数据库设计对性能的影响的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 其它常用配置参数
- 下一篇: linux cmake编译源码,linu