mysql 索引型別 ref MySQL索引型別

2021-10-17 19:46:37 字數 3675 閱讀 9747

面試時曾經被問了mysql的索引型別,我這個寶批龍給達到資料儲存方式上了,聚集索引、二級索引、覆蓋索引,也慢慢對面試有了感覺,面試可能會給你乙個情景,然後深入問裡面的知識點

mysql有多種索引型別,索引是在儲存引擎中實現的,不同的儲存引擎對同乙個索引型別的實現方式不同,不同的儲存引擎支援不同的索引型別

(一)b-tree索引

innodb、ndb、myisam、memory都支援b-tree索引

innodb的預設索引型別為b-tree索引,其底層的資料結構為b+tree

ndb底層的資料結構為t-tree

myisam、memory底層的資料結構為b-tree

b-tree索引能加快訪問資料的速度,因為儲存引擎不在需要進行全表掃瞄。而是從根節點開始遍歷,通過比較節點頁的值和要查詢的值來找到合適的指標進入下層子節點。能進行這樣查詢的原因是b-tree對索引列是順序組織儲存的

葉子節點中儲存了指向了被索引資料的指標(索引段吧),指標指向資料段

innodb儲存引擎中,b+tree索引型別可以分為聚集索引和二級索引

聚集索引和二級索引的唯一區別:葉子節點是否儲存所有資料

二級索引葉子節點存放的資料:index + primary

聚集索引會根據每張表的主鍵構造一棵b+tree,葉子節點儲存所有的資料

(二)雜湊索引

對於每一行資料,儲存引擎都會對所有的索引列計算乙個雜湊碼,雜湊索引將所有的雜湊碼儲存在索引中,同時在雜湊表中儲存指向每個資料行的指標。

只有memory顯示支援雜湊索引,並且是支援非唯一雜湊索引的,如果多個列的雜湊值相同,索引會以鍊錶的方式存放在多個記錄指標到同乙個雜湊條目中,這個和hashmap中處理雜湊衝突的方式有點相同。

注:在雜湊表中是根據雜湊碼值的大小進行排序的,而不是根據儲存的順序進行排序的,所以將無法用於排序

雜湊索引的缺點:

上面的也是雜湊索引的乙個缺點

1)雜湊索引值只包含雜湊值和行指標,不儲存字段值,無法避免讀取行,當找到所在行以後,會對值進行乙個比較,這在產生多個相同雜湊值的時候是非常有必要的

2)不支援部分索引列匹配查詢

3)只支援等值查詢(如in、()、=、<=>),而不支援範圍查詢

4) 產生雜湊衝突時,查詢效率偏慢,並且維護成本很高

innodb有乙個特殊的功能叫做自適應雜湊索引。當innodb注意到某些索引值被使用非常頻繁時,它會在記憶體中基於b-tree索引之上在建立乙個雜湊索引。這樣將加快查詢速度,因為減少了遍歷

(三)全文索引

查詢的是文字中的關鍵字,而不是直接比較索引中的值。全文索引更類似於搜尋引擎做的事,而不是簡單的where條件匹配

myisam、innodb儲存引擎支援全文索引

全文索引支援char、varchar、text、自然語言搜尋、布林搜尋

為什麼需要有全文索引,因為如果使用b-tree索引,用like '%%'做範圍查詢時,將不能使用索引進行查詢,資料量大的時候查詢效率將特別慢(僅是自己的理解)

這裡以mysql官網中的sakila資料庫進行演示:

mysql> show create table actor\g

*************************** 1. row ***************************

table: actor

create table: create table `actor` (

`actor_id` smallint(5) unsigned not null auto_increment,

`first_name` varchar(45) not null,

`last_name` varchar(45) not null,

`last_update` timestamp not null default current_timestamp on update current_timestamp,

primary key (`actor_id`),

key `idx_actor_last_name` (`last_name`)

) engine=innodb auto_increment=201 default charset=utf8

last_name為索引

對last_name進行乙個範圍查詢

mysql> explain select * from actor where last_name like '%s'\g

*************************** 1. row ***************************

id: 1

select_type: ******

table: actor

partitions: null

type: all

possible_keys: null

key: null

key_len: null

ref: null

rows: 200

filtered: 11.11

extra: using where

1 row in set, 1 warning (0.00 sec)

進行全表掃瞄查詢

使用全文索引,新建了一張資料表

mysql> show create table news\g

*************************** 1. row ***************************

table: news

create table: create table `news` (

`id` int(5) not null auto_increment,

`title` varchar(50) not null,

`content` text not null,

primary key (`id`),

fulltext key `content` (`content`)

) engine=innodb auto_increment=4 default charset=utf8

1 row in set (0.00 sec)

在content建立了全文索引

查詢語句:

mysql> explain select id from news where match (content) against ('江歌')\g;

*************************** 1. row ***************************

id: 1

select_type: ******

table: news

partitions: null

type: fulltext

possible_keys: content

key: content

key_len: 0

ref: const

rows: 1

filtered: 100.00

extra: using where; ft_hints: sorted

1 row in set, 1 warning (0.03 sec)

使用全文索引的查詢語句和普通索引的查詢不同

格式為select * from table_name wherematch('index_name') against ('搜尋值')

從sql執**況中看,使用上了索引

(四)空間資料索引

myisam支援

mysql索引型別介紹 mysql索引型別介紹

索引型別介紹 主鍵索引 primary key 要求關鍵字不能重複,也不能為null,同時增加主鍵約束 主鍵索引定義時,不能命名 唯一索引 unique index 要求關鍵字不能重複,同時增加唯一約束 普通索引 index 對關鍵字沒有要求 全文索引 fulltext key 關鍵字的 不是所有欄...

mysql索引型別介紹 mysql索引型別介紹

b 樹是多路平衡查詢樹,相對於平衡二叉樹,對父結點的直接子結點個數,不再僅限於2,可以指定m 自定義 這樣可以在樹的深度不大量增加的前提下,儲存更多的結點。b 樹是通常在檔案系統中使用。特點 a 樹的每個結點最多有m 自定義 子結點 b 若根結點不是葉子結點,則至少有兩個子結點 c 除根結點外的所有...

MySQL索引 索引型別

在mysql有兩種索引型別 hash b 樹 hash索引原理比較簡單就是利用了乙個hash表 說b 樹之前先要了解b 樹的資料結構。不廢話,先上圖。對b 樹做一些解釋,參考上圖。b 樹的資料都在葉子節點上 非葉子節點上的這些都是範圍。舉例 最上面的根節點上的資料是5,28,65代表的是它的三個子樹...