目標:
-
掌握索引、分類、優劣勢
-
使用命令創建、查看、刪除索引
-
理解索引的原理和存儲結構
索引存儲結構
-
索引是在存儲引擎中實現的,也就是說不同的存儲引擎,會使用不同的索引
-
MyISAM和InnoDB存儲引擎:只支持B+ TREE索引, 也就是說默認使用BTREE,不能夠更換
-
MEMORY/HEAP存儲引擎:支持HASH和BTREE索引
B樹和B+樹
數據結構示例網站:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html
B樹圖示
- B樹是爲了磁盤或其它存儲設備而設計的一種多叉(下面你會看到,相對於二叉,B樹每個內結點有多個分支,即多叉)平衡查找樹。 多叉平衡樹
- B樹的高度一般都是在2-4這個高度,樹的高度直接影響IO讀寫的次數。
- 如果是三層樹結構---支撐的數據可以達到20G,如果是四層樹結構---支撐的數據可以達到幾十T
B+樹圖示
B和B+樹的區別
- B樹和B+樹的最大區別在於非葉子節點是否存儲數據的問題。
- B樹是非葉子節點和葉子節點都會存儲數據。
- B+樹只有葉子節點纔會存儲數據,而且存儲的數據都是在一行上,而且這些數據都是有指針指向的,也就是有順序的。
聚集索引和非聚集索引區別
- 聚集還是非聚集指的是 B+Tree 葉節點存的是指針還是數據記錄
- MyISAM 索引和數據分離,使用的是非聚集索引
- InnoDB 數據文件就是索引文件,主鍵索引就是聚集索引
對比如下:
聚集索引
非聚集索引
輔助索引
輔助索引存儲的是主鍵索引的主鍵值,不是地址值。
結論:
1、MySQL非主鍵查詢,則需要搜索兩次索引樹(一次是輔助索引樹,一次是主鍵索引樹),最終取出數據。如下示例
select * from t where id=15
select * from t where name='Alice
從輔助索引樹上找到主鍵後,再在主鍵索引樹下找到數據 我們稱爲回表。
select name from t where name='Alice' 給name做了索引
select id,name from t where name='Alice' 覆蓋索引
select * from t where name='Alice' ?
形成索引樹:利用組合索引 完成覆蓋索引(利用組合索引完成在輔助索引樹的遍歷,不回表)
2、 MySQL表設計需要創建主鍵ID,如果未創建建主鍵,則MySQL會找唯一字段 當主鍵,沒有唯一字段則MySQL自動生成僞列 當主鍵。
3、創建主鍵方案:使用連續自增主鍵,不要用大字符串比如 uuid作爲主鍵,推薦雪花算法 snowflakes。