第一.數據庫優化包括哪些方面
數據庫優化是一個綜合型的技術,並不是通過某一種方式讓數據庫效率提高很多,而是通過多方面的提高,從而使的數據庫提高很多
主要包括:
1.表的設計合理化(三范式)
2.給表要添加合適的索引
3.分表技術(水平分割、垂直分割)
4.定時清除垃圾數據,定時進行碎片整理
5.對mysql的配置進行一些優化
6.讀寫分離
第二.數據庫的設計
2.1好數據庫和糟糕數據庫的對比
良好的數據庫:
1.節省存儲空間
2.保證數據完整性
糟糕的數據庫
1.數據冗余,存儲空間的浪費
2.產生數據不完整
2.2 設計數據庫的步驟
2.2.1充分了解需求
2.2.2標識實體:具體存在的對象,名詞
對象如下
用戶
發帖
回帖
版塊
2.2.3標識屬性
2.2.4.標識關系
一對多:主鍵和非主鍵之間的關系,在多的一方創建一個字段作為外鍵指向一的一方的主鍵
多對多:創建一個第三種表,中間表至少需要2個字段分別作為外鍵指向多對多雙方的各自主鍵
一對一:
唯一外鍵對應:假設一對一的雙方是一對多的關系,在多的一方創建外鍵指向一的一方的主鍵,需要在外鍵
上添加一個unique約束
主鍵對應:將一對一的雙方的主鍵建立映射
2.3數據庫規范化
表設計出來以后,並不是合理的結構,我們需要對表進行規范化(我們通過3范式來對表進行規范化)
2.3.1 第一范式(確保每列的原子性)
第一范式用來規范所有的字段,所有的字段都不可再分,兩列的屬性相近或相似或一樣,盡量合並屬性一樣的列,確保不產生冗余數據。
注意:比如地址這個字段,如果不分類匯總,不排序,僅僅是起一個字符串的作用,這時我們不拆分
上圖所示的用戶信息遵循第一范式的要求,這樣對用戶使用城市進行分類的時候就非常方便,也提高了數據庫的性能。
2.3.2第二范式非主鍵字段必須依賴與主鍵字段,每個表只描述一件事
第二范式需要確保數據庫表中每一列都和主鍵相關,而不能只與主鍵的某一部分相關(主要針對聯合主鍵而言)。
也就是說在一個數據庫表中,一個表中只能保存一種數據,不可以把多種數據保存在同一張數據庫表中。
比如要設計一個訂單信息表,因為訂單中可能會有多種商品,所以要將訂單編號和商品編號作為數據庫表的聯合主鍵,如下圖。
這里產生一個問題:這個表中是以訂單編號和商品編號作為聯合主鍵,這樣在該表中商品名稱、單位、商品價格等信息不與該表的主鍵相關,
而僅僅是與商品的編號相關,所以在這里違反了第二范式的設計原則。
而如果把這個訂單信息表進行拆分,把商品信息分離到另一個表中,把訂單項目表也分離到另一個表中,就非常完美了,如下圖。
這里這樣設計,在很大程度上減小了數據庫的冗余,如果要獲取訂單的商品信息,使用商品編號到商品信息表中查詢即可。
2.3.3第三范式消除傳遞依賴
在非主鍵字段中,如果一個字段可以推導出另外一個字段
比如在設計一個訂單數據表的時候,可以將客戶編號作為一個外鍵和訂單表建立相應的關系,而不可以在訂單表中添加關於客戶其他信息(比如姓名、所屬公司)的字段,
如下面這兩個表所示的設計就是一個滿足第三范式的數據庫表。
這樣在查詢訂單信息的時候,就可以使用客戶編號來引用客戶信息表中的記錄,也不必再訂單信息表中多次輸入客戶信息的內容,減小了數據冗余。
2.3.4反三范式
沒有冗余的數據庫設計可以做到。但是,沒有冗余的數據庫未必是最好的數據庫,有時為了提高運行效率,就必須降低范式標准,
適當保留冗余數據。具體做法是:在概念數據模型設計時遵守第三范式,降低范式標准的工作放到物理數據模型設計時考慮。降低范式就是增加字段,允許冗余,
達到以空間換時間的目的
。
2.3.5規范化和性能
1.數據庫性能和規范化數據庫更重要
通過在給定的表中添加額外的字段,以減少需要從中搜索信息所需要的時間
通過在給定的表中插入計算列(查詢總分),以方便查詢
2進行規范化的同時,還需要綜合考慮數據庫性能
2.3.6范式化設計和反范式化設計的優缺點
1.范式化
優點
缺點
2.反范式化
優點
缺點