MySQL底層索引的原理

2021-10-13 07:23:09 字數 2935 閱讀 8579

mysql索引是基於引擎級別,引擎分為innodb和myisam兩種。雖然二者索引的底層都是由b+樹實現。但在使用形式上又有所不同!

mysql的索引分為很多種:主鍵索引、普通索引、聯合索引等……這裡主要講主鍵、普通以及聯合索引在innodb儲存引擎上的實現原理

1、主鍵索引:(primary key)又叫聚簇索引,在innodb儲存級別上,每個資料表都要有乙個主鍵索引,如果你沒有設定主鍵,則會預設生成一列不可見的主鍵列。推薦使用自增數字主鍵!

2、 普通索引:(index)普普通通,加快查詢效率

--create index [index_name] on [table_name] ([column_name](length))

create

index usernameindex on t_user (

`username`(50

))--alter table [table] add index [index_name] ([column_name](length))

alter

table t_user add

index user_name_index (

`user_name`(50

))

3、 聯合索引:多個字段組合成乙個索引列。遵從【最左原則】

--create index [index_name] on [table_name] ([column_name],[column_name2](length))

create

index user_name_p on t_user (

`user_name`(50

),`password`(50

))--alter table [table] add index [index_name] ([column_name][column_name2](length))

alter

table t_user add

index user_name_index (

`user_name`

,`password`(50

))

1、資料儲存有序

2、多路查詢(相比二叉樹)

3、每個葉子節點可存放多個元素

4、葉子與葉子節點相互鏈路(跟b樹的區別)

5、所有非葉子(根)節點的資料會在葉子節點冗餘乙份

2、普通索引:跟主鍵索引有些不同,它的根節點儲存索引值(加了普通索引欄位的值),葉子節點存放的不是所有資料,而是(索引值+主鍵值)。如果是普通索引查詢,當找到對應的葉子節點後,還需根據拿到的主鍵值,再去走一遍主鍵索引的查詢,才能拿到想查詢的資料。這一過程稱之為「回表」!

(myisam):葉子節點存放實際資料的位址(不用回表)

3、聯合索引:聯合索引就是特殊的普通索引,它是可以將多個字段組合在一起建立乙個聯合的索引。能滿足一些多條件查詢且需快速查詢的場景。使用聯合索引需遵從乙個「最左原則」

打個比方:

create

index user_name_p on t_user (

`user_name`(50

),`password`(50

))

我建立乙個user_name和password的聯合索引。當我在多條件查詢時,想快速查詢,走索引。那麼我的sql語句就一定要有user_name

select

*from t_user where user_name = *** and password = *** 或

select

*from t_user where password = *** and user_name = *** 或

select

*from t_user where user_name = ***

這三種情況都是會走索引的,最左原則就是,左邊的字段一定要有,否則索引將不生效。走全表掃瞄!

4、最左原則:不止聯合索引,普通索引查詢時也應遵循最左原則。例:

select

*from t_user where user_name like

'a%'

--走索引

select

*from t_user where user_name like

'%a'

--不走索引

總結:索引的建立,就是以空間換時間!建立索引需要額外占用磁碟空間,而且當資料有更新的時候,也要額外更新索引。所以索引也不是越多越好!

1、為什麼加索引能提公升查詢速度?

答:建立索引後,資料庫會額外維護乙個根據索引值排好序的索引樹,當查詢的語句的篩選條件中有索引列時,則會去查索引樹,由於是排好序的資料。根據二分查詢法,很容易定位到想查詢的資料所在。另外,假如你索引沒有設計好,使用索引查詢的時間大於全表掃瞄的時間時,則會走全表掃瞄

2、為什麼推薦使用自增id當主鍵?

答:因為有序,由於樹這個資料結構的特性,使得要想成為樹結構,就必須保證有序。自增id就完全符合這個特點,在資料插入時,不必額外去給主鍵排序。能有效提公升資料插入效能;占用空間小!占用空間越小,乙個資料頁就能放更多的資料。資料頁越少,查詢相應加快。插入時也不用頻繁分頁。

3、什麼是資料頁?

答:計算機從磁碟讀取資料就是以頁為單位的,當你想獲取某個資源時,計算機會將這個資源前後的一些資料一起返回給你。這樣你下次再想獲取相鄰資源的時候,就能減少一次磁碟io,提公升查詢效能。mysql也是以這種方式儲存、讀取資料。按主鍵值順序分頁。假如一頁能存16kb的資料,那麼mysql將會把你插入的資料一條一條順序放到資料頁裡。存放滿了就新開一頁,依次迴圈……假如說現有一頁存放了10條資料:主鍵id 1~10。當你想查詢id=8的資料時,第一次查詢,mysql會將1-10這一整頁從磁碟中一次性拿走,快取到記憶體中。當你下次又想查詢id=2的記錄時,則可以直接將記憶體中的資料返回。記憶體要比磁碟快很多。

MySQL索引底層(二) 索引底層原理

聚集索引 上次我們講到了主鍵的索引,我們可以執行一下sql語句 explain select from t user where a 1 我們可以看到這條sql走的是主鍵的索引,而在mysql的innodb中,主鍵索引則是聚集索引,資料的物理順序與鍵值的邏輯 索引 順序相同,其實就是說主鍵索引跟其他...

MySQL索引底層原理

通過hash演算法,能快速檢索資料 資料碰撞問題用鏈位址法 無法進行範圍搜尋 解決雜湊索引無法範圍搜尋的問題 極端情況下會退化成線性鍊錶,自增主鍵必然會導致極端情況 會自動調整樹形態,使其保持平衡,調整會消耗效能 無法完全解決二叉查詢樹的問題 絕對平衡的二叉樹,更耗效能 根本解決了紅黑數的問題 由於...

mysql索引底層原理

索引的本質 資料結構 組織資料的方式 innodb沒有主鍵索引時,判斷是否含有唯一索引,沒有唯一就生成乙個隱藏的row id作為主鍵 在資料較少時是以鍊錶的形式儲存資料的,當資料過多,長鍊表會影響資料的查詢,此時會將資料通過頁的形式進行儲存,預設一頁儲存16kb資料,每頁會與每頁之間通過指標進行連線...