這篇文章給大家介紹該如何進行MySQL的索引分類,內(nèi)容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
創(chuàng)新互聯(lián)建站服務(wù)項目包括富蘊網(wǎng)站建設(shè)、富蘊網(wǎng)站制作、富蘊網(wǎng)頁制作以及富蘊網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,富蘊網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到富蘊省份的部分城市,未來相信會繼續(xù)擴大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!
MySQL的索引分類問題一直讓人頭疼,幾乎所有的資料都會給你列一個長長的清單,給你介紹什么主鍵索引、單值索引,覆蓋索引,自適應(yīng)哈希索引,全文索引,聚簇索引,非聚簇索引等……給人的感覺就是云里霧里,好像MySQL索引的實現(xiàn)方式有很多種,但是都沒有一個清晰的分類。所以本人嘗試總結(jié)了一下如何給MySQL的索引類型分類,便于大家記憶,由于MySQL中支持多種存儲引擎,在不同的存儲引擎中實現(xiàn)略微有所差距,下文中如果沒有特殊聲明,默認指的都是InnoDB存儲引擎。
索引從不同維度劃分可以有很多種名稱,但是需要明確一個問題——索引的本質(zhì)是一種數(shù)據(jù)結(jié)構(gòu),其他索引的劃分則是針對實際應(yīng)用而言。
索引是提高查詢效率的數(shù)據(jù)結(jié)構(gòu),而能夠提高查詢效率的數(shù)據(jù)結(jié)構(gòu)有很多,如二叉搜索樹,紅黑樹,跳表,哈希表(散列表)等,而MySQL中用到了B+Tree和散列表(Hash表)作為索引的底層數(shù)據(jù)結(jié)構(gòu)(其實也用到了跳表實現(xiàn)全文索引,但這不是重要考點,所以可以忽略)。
MySQL并沒有顯式支持Hash索引,而是作為內(nèi)部的一種優(yōu)化。具體在Innodb存儲引擎里,會監(jiān)控對表上二級索引的查找,如果發(fā)現(xiàn)某二級索引被頻繁訪問,二級索引成為熱數(shù)據(jù),就為之建立hash索引。因此,在MySQL的Innodb里,對于熱點的數(shù)據(jù)會自動生成Hash索引。這種hash索引,根據(jù)其使用的場景特點,也叫自適應(yīng)Hash索引。
這個是MySQL索引的基本實現(xiàn)方式。除了全文索引、hash索引,Innodb、MyISAM的索引都是通過B+樹實現(xiàn)的。
為了能應(yīng)對不同的數(shù)據(jù)檢索需求,索引既可以僅包含一個字段,也可以同時包含多個字段。單個字段組成的索引可以稱為單值索引,否則稱之為復(fù)合索引,也稱為組合索引或多值索引。
這個很好理解,假如我們有一張表,有三個屬性,分別是 id,age 和 name 。假如在id上建立索引,那這就是單值索引;如果在 name 和 age 上建立索引,那這就是復(fù)合索引。
復(fù)合索引的索引的數(shù)據(jù)順序跟字段的順序相關(guān),包含多個值的索引中,如果當前面字段的值重復(fù)時,將會按照其后面的值進行排序。
使用覆蓋索引的前提是字段長度比較短,對于值長度較長的字段則不適合使用覆蓋索引,原因有很多,比如索引一般存儲在內(nèi)存中,如果占用空間較大,則可能會從磁盤中加載,影響性能。
MySQL中是根據(jù)主鍵來組織數(shù)據(jù)的,所以每張表都必須有主鍵索引,主鍵索引只能有一個,不能為null同時必須保證唯一性。建表時如果沒有指定主鍵索引,則會自動生成一個隱藏的字段作為主鍵索引。
如果不是主鍵索引,則就可以稱之為非主鍵索引,又可以稱之為輔助索引或者二級索引。主鍵索引的葉子節(jié)點存儲了完整的數(shù)據(jù)行,而非主鍵索引的葉子節(jié)點存儲的則是主鍵索引值,通過非主鍵索引查詢數(shù)據(jù)時,會先查找到主鍵索引,然后再到主鍵索引上去查找對應(yīng)的數(shù)據(jù)。
在這里假設(shè)我們有張表user,具有三列:ID,age,name,create_time,id是主鍵,(age,create_time,,name)建立輔助索引。執(zhí)行如下sql語句:
select name from user where age>2 order by create_time desc。
正常的話,查詢分兩步:
1.按照輔助索引,查找到記錄的主鍵,
2.按照主鍵主鍵索引里查找記錄,返回name。
但實際上,我們可以看到,輔助索引節(jié)點是按照age,create_time,name建立的,索引信息里完全包含我們所要的信息,如果能從輔助索引里返回name信息,則第二步是完全沒有必要的,可以極大提升查詢速度。
按照這種思想Innodb里針對使用輔助索引的查詢場景做了優(yōu)化,叫覆蓋索引(在這里小聲吐槽一下,不知道業(yè)界起這種名詞干嘛,太容易引起歧義了,叫個索引覆蓋查詢不是更好嗎)。
根據(jù)數(shù)據(jù)與索引的存儲關(guān)聯(lián)性,可以分為聚簇索引和非聚簇索引(也叫聚集索引和非聚集索引)。聚簇索引也叫簇類索引,是一種對磁盤上實際數(shù)據(jù)重新組織以按指定的一個或多個列的值排序。整個簡潔的說法,這倆的區(qū)別就是索引的存儲順序和數(shù)據(jù)的存儲順序是否是關(guān)系的,有關(guān)就是聚簇索引,無關(guān)就是非聚簇索引。具體實現(xiàn)方式根據(jù)索引的數(shù)據(jù)結(jié)構(gòu)不同會有所不同。下面以B+樹實現(xiàn)的索引為例,舉例來說明聚簇索引和非聚簇索引。
Innodb的主鍵索引,非葉子節(jié)點存儲的是索引指針,葉子節(jié)點存儲的是既有索引也有數(shù)據(jù),是典型的聚簇索引(這里可以發(fā)現(xiàn),索引和數(shù)據(jù)的存儲順序是強相關(guān)的。因此是典型的聚簇索引),如圖:
MyISAM中索引和數(shù)據(jù)文件分開存儲,B+Tree的葉子節(jié)點存儲的是數(shù)據(jù)存放的地址,而不是具體的數(shù)據(jù),是典型的非聚簇索引;換言之,數(shù)據(jù)可以在磁盤上隨便找地方存,索引也可以在磁盤上隨便找地方存,只要葉子節(jié)點記錄對了數(shù)據(jù)存放地址就行。因此,索引存儲順序和數(shù)據(jù)存儲關(guān)系毫無關(guān)聯(lián),是典型的非聚簇索引,另外Inndob里的輔助索引也是非聚簇索引。
顧名思義,不允許具有索引值相同的行,從而禁止重復(fù)的索引或鍵值。系統(tǒng)在創(chuàng)建該索引時檢查是否有重復(fù)的鍵值,并在每次使用 INSERT 或 UPDATE 語句添加數(shù)據(jù)時進行檢查, 如果有重復(fù)的值,則會操作失敗,拋出異常。
需要注意的是,主鍵索引一定是唯一索引,而唯一索引不一定是主鍵索引。唯一索引可以理解為僅僅是將索引設(shè)置一個唯一性的屬性。
在MySQL 5.6版本以前,只有MyISAM存儲引擎支持全文引擎。在5.6版本中,InnoDB加入了對全文索引的支持,但是不支持中文全文索引.在5.7.6版本,MySQL內(nèi)置了ngram全文解析器,用來支持亞洲語種的分詞。主要用來利用關(guān)鍵詞查詢文本,不是MySQL的主要面向場景,使用較少,這里就不展開討論了。
最后總結(jié)一張腦圖方便記憶:
關(guān)于該如何進行MySQL的索引分類就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
網(wǎng)站欄目:該如何進行MySQL的索引分類
文章位置:http://jinyejixie.com/article48/jjhohp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站建設(shè)、網(wǎng)站營銷、域名注冊、、全網(wǎng)營銷推廣、網(wǎng)站設(shè)計公司
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)