2、Mysql 創建索引

一、爲什麼需要索引?
索引是數據表種一個或者多個列進行排序的數據結構
索引能夠大幅提升檢索速度
創建、更新索引本身也會耗費空間和時間
二、查找結構進化史
線性查找:一個個找;實現簡單;太慢
二分查找:有序;簡單;要求是有序的,插入特別慢
HASH查找:查詢快;佔用空間;不太適合存儲大規模數據
二叉查找樹:插入和查詢很快(log(n));無法存大規模數據,複雜度退化
平衡樹:解決 BST 退化問題,樹是平衡的;節點非常多的時候,依然樹高很高
多路查找樹:一個父親多個孩子節點(度);節點過多樹高不會特別深
多路平衡查找樹:B-Tree
以下數據結構動畫演示推薦這個網址:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

這個網站關於數據結構的演示很直觀,我們可以通過其中的動畫來學習。

比如二叉查找樹退化問題:

可以明顯看到,由於我們輸入的數字是順序增長的,二叉查找樹變成了單邊增長的線性結構,這就是複雜度退化。

平衡樹(AVL)則沒有這個問題:

三、什麼是 B-Tree?
多路平衡查找樹(每個節點最多 m(m>=2) 個孩子,稱爲 m 階或者度)
葉節點具有相同的深度
節點的數據 key 從左到右是遞增的

演示:


四、什麼是 B+Tree ?
Mysql 實際使用的 B+Tree 作爲索引的數據結構
只在葉子節點帶有指向記錄的指針(For what?可以增加樹的度)
葉子節點通過指針相連(For what?實現範圍查詢)


五、Mysql 創建索引類型有哪些?
普通類型(CREATE INDEX)
唯一索引,索引列的值必須唯一(CREATE UNIQUE INDEX)
多列索引
主鍵索引(PRIMARY KEY),一個表只能有一個
全文索引(FULLTEXT INDEX),InnoDB 不支持
六、如何創建合理的索引
經常用作查詢條件的字段
經常用作表連接的字段
經常出現在 order by,group by 之後的字段
如何創建合理的索引可以參考下面的一篇博文,這裏就不詳細展開了哈。

如何創建合理的索引

七、索引如何優化
非空字段 NOT NULL,Mysql 很難對空值作查詢優化
區分度高,離散度大,作爲索引的字段值儘量不要有大量相同值
索引的長度不要太長(比較耗費時間)
索引如何優化可以參考下面的一篇博文,這裏就不詳細展開了哈。

MySQL怎麼優化table scan的

八、什麼是聚集索引和非聚集索引?
聚集還是非聚集指的是 B+Tree 葉節點存的是指針還是數據記錄
MyISAM 索引和數據分離,使用的是非聚集索引
InnoDB 數據文件就是索引文件,主鍵索引就是聚集索引
聚集索引和非聚集索引可以參考下面的一篇博文,這裏就不詳細展開了哈。

聚集索引和非聚集索引的區別

對比如下:

輔助索引

還有一個輔助索引,我們也可以瞭解下。


————————————————
版權聲明:本文爲CSDN博主「riemann_」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/riemann_/article/details/91358943

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