溫馨提示×

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

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

如何在MySQL中創(chuàng)建索引

發(fā)布時(shí)間:2021-05-19 18:03:21 來源:億速云 閱讀:138 作者:Leah 欄目:MySQL數(shù)據(jù)庫

本篇文章為大家展示了如何在MySQL中創(chuàng)建索引,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

什么是索引?

MySQL官方對(duì)索引的定義為:索引(Index)是幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)。我們可以簡(jiǎn)單理解為:快速查找排好序的一種數(shù)據(jù)結(jié)構(gòu)。Mysql索引主要有兩種結(jié)構(gòu):B+Tree索引和Hash索引。我們平常所說的索引,如果沒有特別指明,一般都是指B樹結(jié)構(gòu)組織的索引(B+Tree索引)。索引如圖所示:

如何在MySQL中創(chuàng)建索引

最外層淺藍(lán)色磁盤塊1里有數(shù)據(jù)17、35(深藍(lán)色)和指針P1、P2、P3(黃色)。P1指針表示小于17的磁盤塊,P2是在17-35之間,P3指向大于35的磁盤塊。真實(shí)數(shù)據(jù)存在于子葉節(jié)點(diǎn)也就是最底下的一層3、5、9、10、13……非葉子節(jié)點(diǎn)不存儲(chǔ)真實(shí)的數(shù)據(jù),只存儲(chǔ)指引搜索方向的數(shù)據(jù)項(xiàng),如17、35。

查找過程:例如搜索28數(shù)據(jù)項(xiàng),首先加載磁盤塊1到內(nèi)存中,發(fā)生一次I/O,用二分查找確定在P2指針。接著發(fā)現(xiàn)28在26和30之間,通過P2指針的地址加載磁盤塊3到內(nèi)存,發(fā)生第二次I/O。用同樣的方式找到磁盤塊8,發(fā)生第三次I/O。

真實(shí)的情況是,上面3層的B+Tree可以表示上百萬的數(shù)據(jù),上百萬的數(shù)據(jù)只發(fā)生了三次I/O而不是上百萬次I/O,時(shí)間提升是巨大的。

數(shù)據(jù)表索引可以提高數(shù)據(jù)的檢索效率,也可以降低數(shù)據(jù)庫的IO成本,并且索引還可以降低數(shù)據(jù)庫的排序成本。排序分組操作主要消耗的就是CPU資源和內(nèi)存,所以能夠在排序分組操作中好好的利用索引將會(huì)極大地降低CPU資源的消耗。下面我們將簡(jiǎn)單的分析一下怎樣正確創(chuàng)建MySQL數(shù)據(jù)索引。

怎樣判斷是否需要?jiǎng)?chuàng)建索引?

1、某些字段需要頻繁用作查詢條件時(shí)需要為它建立索引

這個(gè)應(yīng)該都知道,什么樣才是頻繁呢?綜合分析你執(zhí)行的所有SQL語句。最好將他們一個(gè)個(gè)都列出來。然后分析,發(fā)現(xiàn)其中有些字段在大部分的SQL語句查詢時(shí)候都會(huì)用到,那么就果斷為他建立索引。

2、唯一性太差的字段不適合建立索引

什么是唯一性太差的字段?如狀態(tài)字段、類型字段。那些只存儲(chǔ)固定幾個(gè)值的字段,例如用戶登錄狀態(tài)、消息的status等。這個(gè)涉及到了索引掃描的特性。例如:通過索引查找鍵值為A和B的某些數(shù)據(jù),通過A找到某條相符合的數(shù)據(jù),這條數(shù)據(jù)在X頁上面,然后繼續(xù)掃描,又發(fā)現(xiàn)符合A的數(shù)據(jù)出現(xiàn)在了Y頁上面,那么存儲(chǔ)引擎就會(huì)丟棄X頁面的數(shù)據(jù),然后存儲(chǔ)Y頁面上的數(shù)據(jù),一直到查找完所有對(duì)應(yīng)A的數(shù)據(jù),然后查找B字段,發(fā)現(xiàn)X頁面上面又有對(duì)應(yīng)B字段的數(shù)據(jù),那么他就會(huì)再次掃描X頁面,等于X頁面就會(huì)被掃描2次甚至多次。以此類推,所以同一個(gè)數(shù)據(jù)頁可能會(huì)被多次重復(fù)的讀取,丟棄,在讀取,這無疑給存儲(chǔ)引擎極大地增加了IO的負(fù)擔(dān)。

3、更新太頻繁地字段不適合創(chuàng)建索引

當(dāng)你為某個(gè)字段創(chuàng)建索引時(shí)候,如果再次更新這個(gè)字段數(shù)據(jù)時(shí),數(shù)據(jù)庫就會(huì)自動(dòng)更新他的索引,所以當(dāng)這個(gè)字段更新太頻繁地時(shí)候那么就會(huì)不斷的更新索引,性能的影響可想而知。大概被檢索幾十次才會(huì)更新一次的字段才比較符合建立索引的規(guī)范。而如果一個(gè)字段同一個(gè)時(shí)間段內(nèi)被更新多次,那么果斷不能為他建立索引。

4、不會(huì)出現(xiàn)在where條件中的字段不該建立索引

這個(gè)其實(shí)沒什么好說的,不會(huì)用作查詢條件的字段建立了索引也沒用。

上述內(nèi)容就是如何在MySQL中創(chuàng)建索引,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

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

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

AI