MySQL索引——總結篇

MySQL索引

數據庫的三範式,反模式

數據庫範式是爲了解決關係數據庫中數據冗餘、更新異常、插入異常、刪除異常等問題而引入的。數據範式能夠避免數據冗餘、節省空間、增長維護便利性mysql

  • 第一範式(原子性)
    強調屬性的原子性,要求屬性不可再分解sql

  • 第二範式(惟一約束性)
    強調記錄的惟一約束性,表中必須有一主鍵,且非主鍵不能只依賴主鍵的一部分數據庫

  • 第三範式(冗餘性約束)
    強調屬性的冗餘性約束,非主鍵列必須直接依賴於主鍵緩存

  • 反模式
    範式設計下,數據庫業務設計的表可能增多,涉及到多表聯合查詢,致使性能變差。所以,出於性能優先的考量,在數據庫結構中使用反模式的設計,利用空間換取時間,採用數據冗餘的方式避免多表聯合查詢。數據一致性的問題,可選擇儘量使數據達到用戶一致,保證系統一段時間的自我恢復和修正,最終達成一致。性能

零碎知識

  • 數據類型

數值、日期、字符串mysql索引

  • 可變長度類型數據

可變長度類型中varchar(200)與varchar(50)存儲hello所佔空間相同,但前者在排序時會佔用更多內存優化

  • 自增id刪除以後的記錄

InnoDB引擎只將當前自增主鍵的最大id存到內存中,重啓後可能會使最大id丟失;而MyISAM會將最大id記錄到數據文件中設計

  • count 語句的統計

沒有where限定時,InnoDB的count(*)相對MyISM可能慢不少,由於InnoDB是實時統計。而MyISM維護了一個計數器指針

索引

  • 優缺點

優勢:
提升檢索速度,下降IO成本
事前排序,下降查詢時CPU消耗
缺點:
增長存儲空間、下降表更新速度code

  • 使用場景
    小型表不建議使用,適用於中大型表;對特大型表索引的代價更大,可對數據庫表進行分區

  • 索引的六種類型
    普通索引、惟一索引(惟一性)、主鍵索引(不容許爲空)、複合索引、外建索引、全文索引

  • 索引建立原則
    出如今where語句後,而不是select;索引基數越大,效果越好;有時複合索引提升效率;過多索引會佔用磁盤空間;主鍵儘可能選取較短的數據類型;字符串索引應創建一個前綴長度,節省索引空間。

  • 索引使用注意事項
    避免在where後面使用邏輯或表達式操做、使用OR鏈接條件

索引原理

默認使用B Tree索引

B Tree索引

以M路BTree結構爲例(M>=2,不然爲空樹)

  1. 排序方式:全部節點都遞增排序
  2. 子節點數:1<非葉子節點數<=M
  3. 關鍵字數:ceil(M/2)-1 < 關鍵字數 < M-1
  4. 葉子節點:全部子節點均在同一層,包換關鍵字及關鍵字記錄的地址(此外,也有指向其子節點的指針,值爲null)

B+Tree索引

對B Tree索引的一種優化,B+Tree中全部數據記錄節點都按照鍵值大小順序存放在同一層節點上,每一個非葉子節點都只存儲key值信息,這樣可大大增長每一個節點存儲的key值數量,下降樹的高度

  1. 非葉子節點只記錄鍵信息
  2. 全部葉子節點之間都有一個鏈指針
  3. 數據記錄都放在葉子節點中

B Tree 與 B+Tree的比較

  1. B+樹層級更少:B+樹每一個非葉子節點存儲的關鍵字更多,因此層級更少,查詢速度更快
  2. B+樹查詢更穩定:B+樹全部關鍵字地址都存儲在葉子節點上,因此每次查找次數相同,查詢速度更穩定
  3. B+樹具備自然的排序功能:B+樹全部葉子節點數據構成了一個有序鏈表,在查詢區間數據時更方便,數據緊密性高,緩存命中率也高
  4. B+樹全局遍歷更快:B+樹只須要遍歷全部葉子節點,而不須要像B樹一層層進行遍歷
  5. B數對根節點附近的數據訪問速度更快:由於B數非葉子節點自己存有關鍵字其數據地址

彙集索引和輔助索引

彙集索引(主鍵索引),其葉子節點存儲的數據是整行的具體數據;
輔助索引(二級索引),其葉子節點存的是整行數據對應的主鍵值,根據輔助索引查詢數據要通過兩步,即回表:

  1. InnoDB 存儲引擎會遍歷輔助索引找到主鍵
  2. 再經過主鍵在彙集索引中找到完整的行記錄數據
  • 彙集索引的主鍵
    1. 定義主鍵時,InnoDB 存儲引擎會將其當作彙集索引
    2. 沒有定義主鍵時,InnoDB 存儲引擎會定位到第一個惟一索引,且改索引的全部列值均爲非空,將其當作彙集索引
    3. 沒有主鍵且沒有適合的惟一索引,InnoDB 存儲引擎產生一個ID值6字節的彙集索引

彙集索引的注意事項

  1. 插入速度嚴重依賴插入順序,按照主鍵的順序插入是最快的方式,不然出現頁分裂 會影響性能。(所以,通常定義一個自增的Id做爲主鍵)
  2. 更新主鍵會致使更新的行移動,所以通常定義主鍵爲不可更新
  3. 二級索引訪問須要兩次查詢,第一次找到主鍵值,第二次找到行數據。(可是當查詢數據只有id和索引時,可一次查詢直接返回數據,即索引覆蓋)
  4. 主鍵id建議使用整型。如此,主鍵索引的B+樹節點能夠存儲更多主鍵id,輔佐索引的B+樹節點能夠存儲更多主鍵id

索引的最左匹配特徵

當索引種類是複合索引時,B+樹經過從左往右創建搜索樹,即索引的最左匹配特徵

相關文章
相關標籤/搜索