溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

MySql支持哪些索引類型

發(fā)布時間:2021-12-04 11:58:00 來源:億速云 閱讀:204 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要講解了“MySql支持哪些索引類型”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“MySql支持哪些索引類型”吧!

一、什么是索引?

官方解釋:索引(Index)是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。

通俗理解:索引是一種特殊的文件(InnoDB 數(shù)據(jù)表上的索引是表空間的一個組成部分),它們包含著對數(shù)據(jù)表里所有記錄的引用指針。

二、索引可以做什么?

首先,索引不是萬能的,索引可以加快數(shù)據(jù)檢索操作,但會使數(shù)據(jù)修改操作變慢。每次修改數(shù)據(jù)記錄,索引就必須刷新一次。為了在某種程度上彌補這一缺陷,許多 SQL 命令都有一個 DELAY_KEY_WRITE 項。這個選項的作用是暫時制止 MySQL 在該命令每插入一條新記錄和每修改一條現(xiàn)有之后立刻對索引進(jìn)行刷新,對索引的刷新將等到全部記錄插入/修改完畢之后再進(jìn)行。在需要把許多新記錄插入某個數(shù)據(jù)表的場合,DELAY_KEY_WRITE 選項的作用將非常明顯。

三、為什么使用數(shù)據(jù)索引能提高效率?

  • 數(shù)據(jù)索引的存儲是有序的

  • 在有序的情況下,通過索引查詢一個數(shù)據(jù)是無需遍歷索引記錄的

  • 極端情況下,數(shù)據(jù)索引的查詢效率為二分法查詢效率,趨近于 log2(N)

四、MySQL支持哪些索引類型?

我們這里說的索引類型并不是指“主鍵索引”、“外鍵索引”這些,而是索引底層的數(shù)據(jù)結(jié)構(gòu)。MySQL的索引數(shù)據(jù)結(jié)構(gòu)支持以下兩種:

  • B-Tree 索引。B+樹是一個平衡的多叉樹,從根節(jié)點到每個葉子節(jié)點的高度差值不超過1,而且同層級的節(jié)點間有指針相互鏈接,是有序的,如下圖: MySql支持哪些索引類型

  • Hash 索引。哈希索引就是采用一定的哈希算法,把鍵值換算成新的哈希值,檢索時不需要類似B+樹那樣從根節(jié)點到葉子節(jié)點逐級查找,只需一次哈希算法即可,是無序的,如下圖所示: MySql支持哪些索引類型

    • 不支持范圍查詢

    • 不支持索引完成排序

    • 不支持聯(lián)合索引的最左前綴匹配規(guī)則

    • 哈希索引的優(yōu)勢:等值查詢,哈希索引具有絕對優(yōu)勢(前提是:沒有大量重復(fù)鍵值,如果大量重復(fù)鍵值時,哈希索引的效率很低,因為存在所謂的哈希碰撞問題。)

    • 哈希索引不適用的情況:

五、什么情況下應(yīng)不建或少建索引?

我們都知道什么時候應(yīng)該使用索引,那么,什么時候不應(yīng)該使用索引呢?我們上面說到,索引并不是萬能的,所以,索引肯定也有不適用的場景。以下幾個場景的時候,我們應(yīng)該盡量不建或者說少建索引:

  • 表記錄太少。

  • 經(jīng)常插入、刪除、修改的表。

  • 數(shù)據(jù)重復(fù)且分布平均的表字段,假如一個表有10萬行記錄,有一個字段A只有T和F兩種值,且每個值的分布概率大約為50%,那么對這種表A字段建索引一般不會提高數(shù)據(jù)庫的查詢速度。

  • 經(jīng)常和主字段一塊查詢但主字段索引值比較多的表字段。

六、什么是聯(lián)合索引?

  • 聯(lián)合索引是兩個或更多個列上的索引。 對于聯(lián)合索引,MySQL支持從左到右的使用索引中的字段,一個查詢可以只使用索引中的一部份,但只能是最左側(cè)部分。例如索引是key index (a,b,c),可以支持a 、 a,b 、 a,b,c 這3種組合進(jìn)行查找,但不支持 b,c進(jìn)行查找,當(dāng)最左側(cè)字段是常量引用時,索引就十分有效。

  • 利用索引中的附加列,您可以縮小搜索的范圍,但使用一個具有兩列的索引不同于使用兩個單獨的索引。

  • 復(fù)合索引的結(jié)構(gòu)與電話簿類似,人名由姓和名構(gòu)成,電話簿首先按姓氏對進(jìn)行排序,然后按名字對有相同姓氏的人進(jìn)行排序。如果您知道姓,電話簿將非常有用;如果您知道姓和名,電話簿則更為有用,但如果您只知道名不知道姓,電話簿將沒有用處。

七、為什么說B+比B樹更適合實際應(yīng)用中操作系統(tǒng)的文件索引和數(shù)據(jù)庫索引?

  • B+的磁盤讀寫代價更低。B+的內(nèi)部結(jié)點并沒有指向關(guān)鍵字具體信息的指針,因此其內(nèi)部結(jié)點相對B樹更小。如果把所有同一內(nèi)部結(jié)點的關(guān)鍵字存放在同一盤塊中,那么盤塊所能容納的關(guān)鍵字?jǐn)?shù)量也越多。一次性讀入內(nèi)存中的需要查找的關(guān)鍵字也就越多。相對來說IO讀寫次數(shù)也就降低了。

  • B+-tree的查詢效率更加穩(wěn)定。由于非終結(jié)點并不是最終指向文件內(nèi)容的結(jié)點,而只是葉子結(jié)點中關(guān)鍵字的索引。所以任何關(guān)鍵字的查找必須走一條從根結(jié)點到葉子結(jié)點的路。所有關(guān)鍵字查詢的路徑長度相同,導(dǎo)致每一個數(shù)據(jù)的查詢效率相當(dāng)。

感謝各位的閱讀,以上就是“MySql支持哪些索引類型”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對MySql支持哪些索引類型這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI