數據庫範式是爲了解決關係數據庫中數據冗餘、更新異常、插入異常、刪除異常等問題而引入的。數據範式能夠避免數據冗餘、節省空間、增長維護便利性mysql
第一範式(原子性)
強調屬性的原子性,要求屬性不可再分解sql
第二範式(惟一約束性)
強調記錄的惟一約束性,表中必須有一主鍵,且非主鍵不能只依賴主鍵的一部分數據庫
第三範式(冗餘性約束)
強調屬性的冗餘性約束,非主鍵列必須直接依賴於主鍵緩存
反模式
範式設計下,數據庫業務設計的表可能增多,涉及到多表聯合查詢,致使性能變差。所以,出於性能優先的考量,在數據庫結構中使用反模式的設計,利用空間換取時間,採用數據冗餘的方式避免多表聯合查詢。數據一致性的問題,可選擇儘量使數據達到用戶一致,保證系統一段時間的自我恢復和修正,最終達成一致。性能
數值、日期、字符串mysql索引
可變長度類型中varchar(200)與varchar(50)存儲hello所佔空間相同,但前者在排序時會佔用更多內存優化
InnoDB引擎只將當前自增主鍵的最大id存到內存中,重啓後可能會使最大id丟失;而MyISAM會將最大id記錄到數據文件中設計
沒有where限定時,InnoDB的count(*)相對MyISM可能慢不少,由於InnoDB是實時統計。而MyISM維護了一個計數器指針
優勢:
提升檢索速度,下降IO成本
事前排序,下降查詢時CPU消耗
缺點:
增長存儲空間、下降表更新速度code
使用場景
小型表不建議使用,適用於中大型表;對特大型表索引的代價更大,可對數據庫表進行分區
索引的六種類型
普通索引、惟一索引(惟一性)、主鍵索引(不容許爲空)、複合索引、外建索引、全文索引
索引建立原則
出如今where語句後,而不是select;索引基數越大,效果越好;有時複合索引提升效率;過多索引會佔用磁盤空間;主鍵儘可能選取較短的數據類型;字符串索引應創建一個前綴長度,節省索引空間。
索引使用注意事項
避免在where後面使用邏輯或表達式操做、使用OR鏈接條件
默認使用B Tree索引
以M路BTree結構爲例(M>=2,不然爲空樹)
對B Tree索引的一種優化,B+Tree中全部數據記錄節點都按照鍵值大小順序存放在同一層節點上,每一個非葉子節點都只存儲key值信息,這樣可大大增長每一個節點存儲的key值數量,下降樹的高度
彙集索引(主鍵索引),其葉子節點存儲的數據是整行的具體數據;
輔助索引(二級索引),其葉子節點存的是整行數據對應的主鍵值,根據輔助索引查詢數據要通過兩步,即回表:
- InnoDB 存儲引擎會遍歷輔助索引找到主鍵
- 再經過主鍵在彙集索引中找到完整的行記錄數據
當索引種類是複合索引時,B+樹經過從左往右創建搜索樹,即索引的最左匹配特徵