明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

mysql索引是什么及怎么使用的?整理的很詳細(xì)

[摘要]學(xué)習(xí)mysql時(shí),經(jīng)常會(huì)遇見索引吧,到底什么是索引呢?之前我也只是模模糊糊的會(huì)使用,但是讓我解釋出來還真有點(diǎn)困難呢,所以呢趁著空閑時(shí)間就查閱了下書籍,以防以后有人問我,我就整理寫了下,有點(diǎn)印象總歸是...
學(xué)習(xí)mysql時(shí),經(jīng)常會(huì)遇見索引吧,到底什么是索引呢?之前我也只是模模糊糊的會(huì)使用,但是讓我解釋出來還真有點(diǎn)困難呢,所以呢趁著空閑時(shí)間就查閱了下書籍,以防以后有人問我,我就整理寫了下,有點(diǎn)印象總歸是好的,說不會(huì)也挺尷尬的,畢竟也接觸這些有些年頭了,廢話不說了,apache php mysql 講重點(diǎn):

begin!

一、索引是什么

1.索引簡(jiǎn)介
索引其實(shí)是以文件形式存儲(chǔ)在磁盤上的一種數(shù)據(jù)結(jié)構(gòu),索引檢索需要磁盤I/O操作。與主存不同,磁盤I/O存在機(jī)械運(yùn)動(dòng)耗費(fèi),因此磁盤I/O的時(shí)間消耗是巨大的。

2.IO簡(jiǎn)介
IO在計(jì)算機(jī)中指 輸入與輸出,由于程序和運(yùn)行時(shí)數(shù)據(jù)是在內(nèi)存中駐留,由CPU這個(gè)超快的計(jì)算核心來執(zhí)行,涉及到數(shù)據(jù)交換的地方,通常是磁盤、網(wǎng)絡(luò)等,就需要IO接口。生活例子: 需要記住關(guān)鍵的事情都需要寫在筆記本上,需要的時(shí)候在拿出來看,每次去筆記本上看記錄時(shí)就是IO,如果記憶好的人會(huì)記住這件事情,直接就能讀出來,這就是緩存(計(jì)算機(jī)里面更加不能一直保存)。

二、索引算法

1.數(shù)據(jù)庫(kù)基本都是使用B+Tree算法實(shí)現(xiàn)

2.數(shù)據(jù)庫(kù)索引是使用磁盤I/O次數(shù)來評(píng)價(jià)索引結(jié)構(gòu)的優(yōu)劣

3.B-Tree
(1) B-Tree的定義,可知檢索一次最多需要訪問h-1個(gè)節(jié)點(diǎn)(根節(jié)點(diǎn)常駐內(nèi)存)。數(shù)據(jù)庫(kù)系統(tǒng)的設(shè)計(jì)者巧妙利用了磁盤預(yù)讀原理,將一個(gè)節(jié)點(diǎn)的大小設(shè)為等于一個(gè)頁(yè),這樣每個(gè)節(jié)點(diǎn)只需要一次I/O就可以完全載入

(2) 實(shí)際實(shí)現(xiàn)B-Tree還需要使用如下技巧:每次新建節(jié)點(diǎn)時(shí),直接申請(qǐng)一個(gè)頁(yè)的空間,這樣就保證一個(gè)節(jié)點(diǎn)物理上也存儲(chǔ)在一個(gè)頁(yè)里,加之計(jì)算機(jī)存儲(chǔ)分配都是按頁(yè)對(duì)齊的,就實(shí)現(xiàn)了一個(gè)node只需一次I/O

(3) 采用B-Tree存儲(chǔ)結(jié)構(gòu),搜索時(shí)I/O次數(shù)一般不會(huì)超過3次,所以用B-Tree作為索引結(jié)構(gòu)效率是非常高的,但是B-tree中的節(jié)點(diǎn)根據(jù)實(shí)際情況可以包含大量的關(guān)鍵字信息和分支

4.B+Tree
(1) B-Tree的搜索復(fù)雜度為O(h)=O(logdN),所以樹的出度d越大,深度h就越小,I/O的次數(shù)就越少。B+Tree恰恰可以增加出度d的寬度,因?yàn)槊總(gè)節(jié)點(diǎn)大小為一個(gè)頁(yè)大小,所以出度的上限取決于節(jié)點(diǎn)內(nèi)key和data的大小

(2) 由于B+Tree的內(nèi)節(jié)點(diǎn)去掉了data,因此可以擁有更大的出度,從而擁有更好的性能

三、聚集索引與非聚集索引

1.聚簇索引
(1) 聚簇索引的數(shù)據(jù)的物理存放順序與索引順序是一致的,即:只要索引是相鄰的,那么對(duì)應(yīng)的數(shù)據(jù)一定也是相鄰地存放在磁盤上的。聚簇索引要比非聚簇索引查詢效率高很多

(3) 每個(gè)表只能有一個(gè)聚簇索引,因?yàn)橐粋(gè)表中的記錄只能以一種物理順序存放

(4) Innodb的默認(rèn)索引

2.非聚簇索引

(1) 非聚集索引,類似于圖書的附錄,那個(gè)專業(yè)術(shù)語(yǔ)出現(xiàn)在哪個(gè)章節(jié),這些專業(yè)術(shù)語(yǔ)是有順序的,但是出現(xiàn)的位置是沒有順序的。但是,一個(gè)表可以有不止一個(gè)非聚簇索引

(2) 實(shí)現(xiàn)原理就是使用葉子節(jié)點(diǎn)存儲(chǔ)引用行的主鍵(可以說是聚集索引)

(3) 聚集索引是非聚簇索引的一種索引,即主+輔索引的索引方式,這種主+輔索引的好處是,當(dāng)發(fā)生數(shù)據(jù)行移動(dòng)或者頁(yè)分裂時(shí),輔助索引樹不需要更新,因?yàn)檩o助索引樹存儲(chǔ)的是主索引的主鍵關(guān)鍵字,而不是數(shù)據(jù)具體的物理地址

(4)所以非聚簇索引要訪問兩次索引

四、索引的類型

1.UNIQUE(唯一索引):不可以出現(xiàn)相同的值,可以有NULL值

2.INDEX(普通索引):允許出現(xiàn)相同的索引內(nèi)容

3.PROMARY KEY(主鍵索引):不允許出現(xiàn)相同的值

4.FULLTEXT INDEX(全文索引):可以針對(duì)值中的某個(gè)單詞,但效率很差

5.組合索引:實(shí)質(zhì)上是將多個(gè)字段建到一個(gè)索引里,列值的組合必須唯一

五、索引技巧

1.索引不會(huì)包含有NULL的列

(1) 只要列中包含有NULL值,都將不會(huì)被包含在索引中,復(fù)合索引中只要有一列含有NULL值,那么這一列對(duì)于此符合索引就是無效的

2.使用短索引

(1)對(duì)串列進(jìn)行索引,如果可以就應(yīng)該指定一個(gè)前綴長(zhǎng)度。例如,如果有一個(gè)char(255)的列,如果在前10個(gè)或20個(gè)字符內(nèi),多數(shù)值是唯一的,那么就不要對(duì)整個(gè)列進(jìn)行索引。短索引不僅可以提高查詢速度而且可以節(jié)省磁盤空間和I/O操作

3.索引列排序

(1) mysql查詢只使用一個(gè)索引,因此如果where子句中已經(jīng)使用了索引的話,那么order by中的列是不會(huì)使用索引的。因此數(shù)據(jù)庫(kù)默認(rèn)排序可以符合要求的情況下不要使用排序操作,盡量不要包含多個(gè)列的排序,如果需要最好給這些列建復(fù)合索引

4.like語(yǔ)句操作

(1) 一般情況下不鼓勵(lì)使用like操作,如果非使用不可,注意正確的使用方式。like ‘%aaa%’不會(huì)使用索引,而like ‘a(chǎn)aa%’可以使用索引

5.不要在列上進(jìn)行運(yùn)算

6.不使用NOT IN 、<>、!=操作,但<,<=,=,>,>=,BETWEEN,IN是可以用到索引的

7.索引要建立在經(jīng)常進(jìn)行select操作的字段上

(1) 這是因?yàn),如果這些列很少用到,那么有無索引并不能明顯改變查詢速度。相反,由于增加了索引,反而降低了系統(tǒng)的維護(hù)速度和增大了空間需求

8.索引要建立在值比較唯一的字段上

9.對(duì)于那些定義為text、image和bit數(shù)據(jù)類型的列不應(yīng)該增加索引。因?yàn)檫@些列的數(shù)據(jù)量要么相當(dāng)大,要么取值很少

10.在where和join中出現(xiàn)的列需要建立索引

11.where的查詢條件里有不等號(hào)(where column != …),mysql將無法使用索引

12.如果where字句的查詢條件里使用了函數(shù)(如:where DAY(column)=…),mysql將無法使用索引

13.在join操作中(需要從多個(gè)數(shù)據(jù)表提取數(shù)據(jù)時(shí)),mysql只有在主鍵和外鍵的數(shù)據(jù)類型相同時(shí)才能使用索引,否則及時(shí)建立了索引也不會(huì)使用

14.explain可以幫助開發(fā)人員分析SQL問題,explain顯示了mysql如何使用索引來處理select語(yǔ)句以及連接表,可以幫助選擇更好的索引和寫出更優(yōu)化的查詢語(yǔ)句

六、索引與鎖

1.鎖用到索引就是行鎖,如果沒有用到索引就是表鎖,所以操作的數(shù)據(jù)必須用到鎖才行

(1) 如果沒有建立索引的話,在進(jìn)行數(shù)據(jù)選取或者定位的時(shí)候是通過全表掃描的形式來進(jìn)行的,這樣就會(huì)形成表鎖,要是有索引的話就會(huì)直接定位到指定的行,就是形成行鎖,這里注意在更新數(shù)據(jù)時(shí)假如沒用到索引也會(huì)全表掃描

end

這樣內(nèi)容大多都是我平時(shí)積攢的,有的不清楚的參考了網(wǎng)絡(luò)和書籍,多多諒解!

相關(guān)文章:

mysql索引名稱如何使用,在什么時(shí)候使用

什么是索引?Mysql目前主要的幾種索引類型

相關(guān)視頻:

索引簡(jiǎn)單介紹-六天帶你玩轉(zhuǎn)MySQL視頻教程

以上就是mysql索引是什么及怎么使用的?整理的很詳細(xì)的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注php中文網(wǎng)其它相關(guān)文章!


學(xué)習(xí)教程快速掌握從入門到精通的SQL知識(shí)。