mysql索引預設是什麼意思 MySQL索引的理解

2021-10-17 15:51:21 字數 3207 閱讀 1200

一、索引是什麼?

索引是幫助mysql高效獲取資料的資料結構。

二、索引能幹什麼?

索引非常關鍵,尤其是當表中的資料量越來越大時,索引對於效能的影響愈發重要。索引能夠輕易將查詢效能提高好幾個數量級,總的來說就是可以明顯的提高查詢效率。

三、索引的分類?

1、從儲存結構上來劃分:btree索引(b-tree或b+tree索引),hash索引,full-index全文索引,r-tree索引。這裡所描述的是索引儲存時儲存的形式,

2、從應用層次來分:普通索引,唯一索引,復合索引

3、根據中資料的物理順序與鍵值的邏輯(索引)順序關係:聚集索引,非聚集索引。

平時講的索引型別一般是指在應用層次的劃分。

就像手機分類:安卓手機,ios手機 與 華為手機,蘋果手機,oppo手機一樣。

普通索引:即乙個索引只包含單個列,乙個表可以有多個單列索引

唯一索引:索引列的值必須唯一,但允許有空值

復合索引:多列值組成乙個索引,專門用於組合搜尋,其效率大於索引合併

聚簇索引(聚集索引):並不是一種單獨的索引型別,而是一種資料儲存方式。具體細節取決於不同的實現,innodb的聚簇索引其實就是在同乙個結構中儲存了b-tree索引(技術上來說是b+tree)和資料行。

非聚簇索引:不是聚簇索引,就是非聚簇索引

四、索引的底層實現

mysql預設儲存引擎innodb只顯式支援b-tree( 從技術上來說是b+tree)索引,對於頻繁訪問的表,innodb會透明建立自適應hash索引,即在b樹索引基礎上建立hash索引,可以顯著提高查詢效率,對於客戶端是透明的,不可控制的,隱式的。

不談儲存引擎,只討論實現(抽象)

4.1、hash索引

基於雜湊表實現,只有精確匹配索引所有列的查詢才有效,對於每一行資料,儲存引擎都會對所有的索引列計算乙個雜湊碼(hash code),並且hash索引將所有的雜湊碼儲存在索引中,同時在索引表中儲存指向每個資料行的指標。

4.2、b-tree索引(mysql使用b+tree)

b-tree能加快資料的訪問速度,因為儲存引擎不再需要進行全表掃瞄來獲取資料,資料分布在各個節點之中。

4.3、b+tree索引

是b-tree的改進版本,同時也是資料庫索引索引所採用的儲存結構。資料都在葉子節點上,並且增加了順序訪問指標,每個葉子節點都指向相鄰的葉子節點的位址。相比b-tree來說,進行範圍查詢時只需要查詢兩個節點,進行遍歷即可。而b-tree需要獲取所有節點,相比之下b+tree效率更高。

結合儲存引擎來討論(一般預設使用b+tree)

案例:假設有一張學生表,id為主鍵

idnamebirthday

tom1996-01-01

jann

1996-01-04

ray1996-01-08

michael

1996-01-10

jack

1996-01-13

steven

1996-01-23

lily

1996-01-25

在myisam引擎中的實現(二級索引也是這樣實現的)

在innodb中的實現

五、為什麼索引結構預設使用b+tree,而不是hash,二叉樹,紅黑樹?

b-tree:因為b樹不管葉子節點還是非葉子節點,都會儲存資料,這樣導致在非葉子節點中能儲存的指標數量變少(有些資料也稱為扇出),指標少的情況下要儲存大量資料,只能增加樹的高度,導致io操作變多,查詢效能變低;

hash:雖然可以快速定位,但是沒有順序,io複雜度高。

二叉樹:樹的高度不均勻,不能自平衡,查詢效率跟資料有關(樹的高度),並且io代價高。

六、為什麼官方建議使用自增長主鍵作為索引?

結合b+tree的特點,自增主鍵是連續的,在插入過程中儘量減少頁**,即使要進行頁**,也只會**很少一部分。並且能減少資料的移動,每次插入都是插入到最後。總之就是減少**和移動的頻率。

6.1、插入連續的資料:

6.2、插入非連續的資料:

七、簡單總結下

1、mysql使用b+tree作為索引資料結構。

2、b+tree在新增資料時,會根據索引指定列的值對舊的b+tree做調整。

3、從物理儲存結構上說,b-tree和b+tree都以頁(4k)來劃分節點的大小,但是由於b+tree中中間節點不儲存資料,因此b+tree能夠在同樣大小的節點中,儲存更多的key,提高查詢效率。

4、影響mysql查詢效能的主要還是磁碟io次數,大部分是磁頭移動到指定磁軌的時間花費。

5、myisam儲存引擎下索引和資料儲存是分離的,innodb索引和資料儲存在一起。

6、innodb儲存引擎下索引的實現,(輔助索引)全部是依賴於主索引建立的(輔助索引中葉子結點儲存的並不是資料的位址,還是主索引的值,因此,所有依賴於輔助索引的都是先根據輔助索引查到主索引,再根據主索引查資料的位址)。

7、由於innodb索引的特性,因此如果主索引不是自增的(id作主鍵),那麼每次插入新的資料,都很可能對b+tree的主索引進行重整,影響效能。因此,盡量以自增id作為innodb的主索引。

1m網速是什麼意思,1m頻寬是什麼意思

等等,也就是說我們在正常的情況下可以擁有最多不超過64k的專有頻寬。注意是 不高於 那麼也就是說很多時候我們的專有頻寬可能小於64k,那有又是為什麼呢?事實上,中國電信的adsl是執行在atm上面,atm到chinanet邊緣路由器頻寬是155m,每乙個邊緣路由器可以連線3000使用者,如果這些用 ...

uma是什麼意思 UMA是什麼意思?

展開全部 uma 不明生物 是636f707962616964757a686964616f31333431376537動畫 進化戰記 betterman 中的一類人造怪物的統稱,是生命工學食料研究所 b.p.l.所長梅崎博士製造出來 協助他利用阿尼瑪斯之花 大量製造蛋白質 具有驚人攻擊性的怪物。阿拉...

是什麼意思?

meta是html中的元標籤,其中包含了對應html的相關資訊,客戶端瀏覽器或伺服器端的程式會根據這些資訊進行處理。http equiv類似於http的頭部協議,它回應給瀏覽器一些有用的資訊,以幫助正確和精確地顯示網頁內容。content 內容型別 重要!這個網頁的格式是文字的,網頁模式 chars...