您好,登錄后才能下訂單哦!
這篇文章主要講解了“MySql支持哪些索引類型”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“MySql支持哪些索引類型”吧!
官方解釋:索引(Index)是幫助MySQL高效獲取數據的數據結構。
通俗理解:索引是一種特殊的文件(InnoDB 數據表上的索引是表空間的一個組成部分),它們包含著對數據表里所有記錄的引用指針。
首先,索引不是萬能的,索引可以加快數據檢索操作,但會使數據修改操作變慢。每次修改數據記錄,索引就必須刷新一次。為了在某種程度上彌補這一缺陷,許多 SQL 命令都有一個 DELAY_KEY_WRITE 項。這個選項的作用是暫時制止 MySQL 在該命令每插入一條新記錄和每修改一條現有之后立刻對索引進行刷新,對索引的刷新將等到全部記錄插入/修改完畢之后再進行。在需要把許多新記錄插入某個數據表的場合,DELAY_KEY_WRITE 選項的作用將非常明顯。
數據索引的存儲是有序的
在有序的情況下,通過索引查詢一個數據是無需遍歷索引記錄的
極端情況下,數據索引的查詢效率為二分法查詢效率,趨近于 log2(N)
我們這里說的索引類型并不是指“主鍵索引”、“外鍵索引”這些,而是索引底層的數據結構。MySQL的索引數據結構支持以下兩種:
B-Tree 索引。B+樹是一個平衡的多叉樹,從根節點到每個葉子節點的高度差值不超過1,而且同層級的節點間有指針相互鏈接,是有序的,如下圖:
Hash 索引。哈希索引就是采用一定的哈希算法,把鍵值換算成新的哈希值,檢索時不需要類似B+樹那樣從根節點到葉子節點逐級查找,只需一次哈希算法即可,是無序的,如下圖所示:
不支持范圍查詢
不支持索引完成排序
不支持聯合索引的最左前綴匹配規則
哈希索引的優勢:等值查詢,哈希索引具有絕對優勢(前提是:沒有大量重復鍵值,如果大量重復鍵值時,哈希索引的效率很低,因為存在所謂的哈希碰撞問題。)
哈希索引不適用的情況:
我們都知道什么時候應該使用索引,那么,什么時候不應該使用索引呢?我們上面說到,索引并不是萬能的,所以,索引肯定也有不適用的場景。以下幾個場景的時候,我們應該盡量不建或者說少建索引:
表記錄太少。
經常插入、刪除、修改的表。
數據重復且分布平均的表字段,假如一個表有10萬行記錄,有一個字段A只有T和F兩種值,且每個值的分布概率大約為50%,那么對這種表A字段建索引一般不會提高數據庫的查詢速度。
經常和主字段一塊查詢但主字段索引值比較多的表字段。
聯合索引是兩個或更多個列上的索引。 對于聯合索引,MySQL支持從左到右的使用索引中的字段,一個查詢可以只使用索引中的一部份,但只能是最左側部分。例如索引是key index (a,b,c),可以支持a 、 a,b 、 a,b,c 這3種組合進行查找,但不支持 b,c進行查找,當最左側字段是常量引用時,索引就十分有效。
利用索引中的附加列,您可以縮小搜索的范圍,但使用一個具有兩列的索引不同于使用兩個單獨的索引。
復合索引的結構與電話簿類似,人名由姓和名構成,電話簿首先按姓氏對進行排序,然后按名字對有相同姓氏的人進行排序。如果您知道姓,電話簿將非常有用;如果您知道姓和名,電話簿則更為有用,但如果您只知道名不知道姓,電話簿將沒有用處。
B+的磁盤讀寫代價更低。B+的內部結點并沒有指向關鍵字具體信息的指針,因此其內部結點相對B樹更小。如果把所有同一內部結點的關鍵字存放在同一盤塊中,那么盤塊所能容納的關鍵字數量也越多。一次性讀入內存中的需要查找的關鍵字也就越多。相對來說IO讀寫次數也就降低了。
B+-tree的查詢效率更加穩定。由于非終結點并不是最終指向文件內容的結點,而只是葉子結點中關鍵字的索引。所以任何關鍵字的查找必須走一條從根結點到葉子結點的路。所有關鍵字查詢的路徑長度相同,導致每一個數據的查詢效率相當。
感謝各位的閱讀,以上就是“MySql支持哪些索引類型”的內容了,經過本文的學習后,相信大家對MySql支持哪些索引類型這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。