002-MySQL數據庫索引

Java知識點總結系列目錄

1. MySQL索引數據結構以及各自特點

  • 二叉樹
    左子節點小於父節點,右子節點大等於父節點。

    當索引爲已排序數據時,導致二叉樹變成了鏈表,查找複雜度爲N

    每個節點只存儲一個記錄,數據量大時樹高度比較大,查找困難;每個節點只存儲一個記錄,導致一次查詢有可能多次磁盤

  • 紅黑樹
    自平衡二叉查找樹。左右子樹的高度相差較大時,自動旋轉平衡,樹的高度相對於二叉樹小一點

  • Hash表
    優點在於:在確定值的情況下,對於讀寫定位都很快

    缺點在於:區間範圍查找困難,比如>, <, between 等,order by和group by也很困難

  • B-Tree
    B-Tree結構
    一個節點包含多個索引,這樣樹的高度可控。節點大小有限制;可通過show global status like 'innodb_page_size'; 查看節點的大小,一般爲16KB。

  • B+Tree
    B+Tree結構
    葉子節點從左到右遞增。B+Tree中葉子節點增加了指針連接,在範圍查找時非常方便,比如選取大於30的記錄,順着葉子節點向右的指針就可以查找出所有符合的記錄,而不用再從根節點一次遍歷查找

2. MySQL數據表存儲引擎

  • InnoDB存儲引擎
    InnoDB存儲引擎索引實現
    InnoDB存儲引擎存儲的表主鍵索引的葉子節點存儲的數據記錄本身,索引和數據都在B+Tree上,爲聚集索引類型。

    數據是以索引的結構組織在一起的,所以InnoDB存儲引擎的表必須要有主鍵,如果沒有顯示的設置主鍵,系統自動選取一個具有唯一值的列作爲主鍵,選不到時創建一個輔助的具有唯一值的列作爲主鍵進行自動維護。

    整型的自增型主鍵好處在於,第一整型存儲較小,第二在於數據的插入和查詢效率較高

    非聚集類索引葉子節點數據部分存儲的是主鍵,所以使用非聚集索引檢索數據時需要查找兩次,先在當前索引樹上找到主鍵,再通過主鍵在主鍵聚集索引樹上找到對應的數據記錄

  • MyISAM存儲引擎
    MyISAM存儲引擎索引實現
    MyISAM存儲引擎存儲的表葉子節點存儲的數據是對應的記錄的磁盤地址,索引文件和數據文件分離,爲非聚集索引類型

3. 聚集索引和非聚集索引

  • 聚集索引
    數據存儲在索引樹上。索引的邏輯順序和數據的物理順序一致

    一張表只能有一個聚集索引。InnoDB將主鍵與數據聚集在一起的方式,使得按主鍵順序的插入和查詢效率會很高,更新主鍵或者不按主鍵的順序插入數據的代價會比較高

  • 非聚集索引
    數據不存儲在索引樹上,只存儲數據的指向指針。索引的邏輯順序和數據的物理順序不同

    一張表可有多個非聚集索引,葉子節點數據部分存儲對應的主鍵值

  • 使用場景

動作描述 使用聚集索引 使用非聚集索引
列經常被分組排序
返回某範圍內的數據 不應
一個或極少不同值 不應 不應
小數目的不同值 不應
大數目的不同值 不應
頻繁更新的列 不應
外鍵列
主鍵列
頻繁修改索引列 不應

4. 聯合索引

  • 概述
    1、兩個或更多個列上的索引被稱作聯合索引,聯合索引又叫複合索引。

    2、對於複合索引:MySQL從左到右的使用索引中的字段,一個查詢可以只使用索引中的一部份,但只能是最左側部分。例如索引是key index (a,b,c). 可以支持a | a,b| a,b,c 3種組合進行查找,但不支持 b,c進行查找 . a,c組合也可以,但實際上只用到了a的索引,c並沒有用到! 當最左側字段是常量引用時,索引就十分有效。where條件中and的順序MySQL會自動調整,所以and的順序不一定非要按照abc的順序

  • 規則

    1、 需要加索引的字段,要在where條件中

    2、數據量少的字段不需要加索引

    3、如果where條件中是OR關係,加索引不起作用(InnoDB存儲引擎)

    4、符合最左原則,使用最頻繁的一列放在最左邊

    5、列中包含有NULL值都將不會被包含在索引中,複合索引中只要有一列含有NULL值,那麼這一列對於此複合索引就是無效的。所以我們在數據庫設計時不要讓字段的默認值爲NULL

    6、聯合索引比對每個列分別建索引更有優勢,因爲索引建立得越多就越佔磁盤空間,在更新數據的時候速度會更慢

5. Explain查看索引使用情況

  • explain結果個字段表述的意義請參考
    https://www.cnblogs.com/DreamDrive/p/7752960.html

  • key_len是一個很重要的參數,它的長度可以計算出當前SQL語句使用了哪些索引,計算方法請參考
    https://www.cnblogs.com/xuanzhi201111/p/4554769.html

MySQL索引專題可參考(高大全)
https://www.cnblogs.com/softidea/archive/2016/08/29/5816497.html

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