Mysql 索引介紹及原理(二)索引的原理和存儲結構

目標:

  • 掌握索引、分類、優劣勢 

  • 使用命令創建、查看、刪除索引 

  • 理解索引的原理和存儲結構


索引存儲結構

 

  • 索引是在存儲引擎中實現的,也就是說不同的存儲引擎,會使用不同的索引

  • 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。
 

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