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

對于MySQL 索引詳細說明

[摘要]mysql的索引是通過B+tree的方式的。B+tree是平衡二叉樹的變種,所以查詢的速度是非?斓摹K饕饕譃榫奂饕洼o助索引:聚集索引:mysql中的數(shù)據(jù)是通過主鍵的聚集索引儲存的,葉子節(jié)點中存放的就是每一行的數(shù)據(jù),所以我們通過主鍵進行查詢速度如初快的原因就是主鍵是聚集索引,而實際使用中只...
mysql的索引是通過B+tree的方式的。B+tree是平衡二叉樹的變種,所以查詢的速度是非?斓。

索引主要分為聚集索引和輔助索引:

聚集索引:mysql中的數(shù)據(jù)是通過主鍵的聚集索引儲存的,葉子節(jié)點中存放的就是每一行的數(shù)據(jù),所以我們通過主鍵進行查詢速度

如初快的原因就是主鍵是聚集索引,而實際使用中只會構(gòu)建一顆這樣的B+tree,所以這就可以解釋為什么主鍵唯一了。

引用網(wǎng)上的圖:

關(guān)于MySQL 索引詳解

每一層的查找就是一次的IO操作,而一般B+tree層數(shù)都在2-4層 所以相當(dāng)于最差的情況下,只需要做4次的IO操作。

輔助索引:輔助索引和聚集索引不同的地方在于葉子節(jié)點中儲存的不是全部的數(shù)據(jù),儲存的是數(shù)據(jù)所在的位置。相當(dāng)于我們使用了

輔助索引查找到數(shù)據(jù)之后,還需要在通過聚集索引的樹查找詳細的信息。

引用網(wǎng)上的圖:

關(guān)于MySQL 索引詳解

這個圖是一個邏輯上的圖,但是底層是通過葉子節(jié)點指向了所在的聚集索引,也就是說,接下面還需要在走一遍第一種圖的

邏輯。

所以最終的是多個輔助索引樹指向一個聚集索引樹

關(guān)于MySQL 索引詳解

(畫的真tm丑)

關(guān)于什么時候應(yīng)該創(chuàng)索引

因為這是一棵樹,通過二分查找的方式來進行檢索,所以適用在作為where后面的條件時,并且這個值是很大范圍內(nèi)的,適合創(chuàng)建索引。對于那些范圍很小的的(is_delete,sex等等枚舉)是不適合的。

對于具體的情況,我們可以通過show index來進行分析:

show index from company_related_person

結(jié)果:

關(guān)于MySQL 索引詳解

然后通過cardinality計算

select 105/(select count(*) from company_related_person) from DUAL

這里得到的結(jié)果是0.913(這個數(shù)值和儲存量有關(guān),最好有一定的數(shù)據(jù)量) 這個數(shù)值越接近1 索引的效率就越高,如果求出的值非常小,建議不要創(chuàng)建索引

我們可以同時可以通過explain查看索引的使用情況

EXPLAIN select * from company_related_person where company_id='2'

輸出

關(guān)于MySQL 索引詳解

key表示的就是當(dāng)前使用的索引列。最后的extra表示的就是使用何種方式,這里是 Using index 表示的就是使用了索引,如果Using filesort 表示的就是直接讀磁盤了

對于那些查詢慢的sql復(fù)雜語句,可以通過這種方式進行分析。

SQL性能優(yōu)化的目標(biāo):至少要達到 range 級別,要求是ref級別,如果可以是consts最好。

1)consts 單表中最多只有一個匹配行(主鍵或者唯一索引),在優(yōu)化階段即可讀取到數(shù)據(jù)。

2)ref 指的是使用普通的索引(normal index)。

3)range 對索引進行范圍檢索

4) index 表示的是直接去磁盤中讀取

從上面的那種圖也可以看到我們使用的是ref

關(guān)于index和key的區(qū)別:

在我們創(chuàng)建索引的時候,經(jīng)常會有這個疑問,index和key有什么區(qū)別?。Key即鍵值,是關(guān)系模型理論中的一部份,比如有主鍵(Primary Key),外鍵(Foreign Key)等,用于數(shù)據(jù)完整性檢否與唯一性約束等。而Index則處于實現(xiàn)層面,比如可以對表個的任意列建立索引,那么當(dāng)建立索引的列處于SQL語句中的Where條件中時,就可以得到快速的數(shù)據(jù)定位,從而快速檢索。至于Unique Index,則只是屬于Index中的一種而已,建立了Unique Index表示此列數(shù)據(jù)不可重復(fù)

以上就是關(guān)于MySQL 索引詳解的詳細內(nèi)容,更多請關(guān)注php中文網(wǎng)其它相關(guān)文章!


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