轉貼 mysql索引型別 按儲存結構劃分

2021-10-09 07:38:47 字數 1754 閱讀 8735

關於mysql索引型別,網上有很多相關的介紹,給人的感覺很亂。鄙人在翻閱相關書籍後,特意梳理了一下。**有不對的地方,歡迎指正!

1. b-tree索引

它使用b-tree資料結構來儲存資料,實際上很多儲存引擎使用的是b+tree。b+tree和b-tree的不同點在於:

(1) 非葉子節點只儲存鍵值資訊

(2) 所有葉子節點之間都有鏈指標

(3) 資料記錄都存放在葉子節點中

b-tree模型:

b+tree模型:

b-tree對索引列是順序組織儲存的,很適合查詢範圍資料。看下b-tree索引適用哪些查詢:

(1) 全值匹配 

全值匹配是指查詢中使用的條件和索引中的所有列進行匹配。比如有索引 index(last_name, first_name, date) ,查詢的條件為:where last_name=? and first_name=? and date=? 。

(2) 匹配最左字首

只使用索引的第一列。比如查詢條件為:where last_name = ?

(3) 匹配列字首

只匹配某一列值得開頭部分。

(4) 匹配範圍值

(5) 精確匹配某一列並範圍匹配另一列

比如:where last_name = ? and first_name like kim%

(6) 只訪問索引的查詢 

2. 雜湊索引

雜湊索引基於雜湊表實現。雜湊索引將所有的雜湊碼儲存在索引中,同時在雜湊表中儲存指向每個資料行的指標。在mysql中,memory引擎顯式支援雜湊索引。

舉例說明,有張表:

create table testhash (

fname varchar(50) not null,

lname varchar(50) not null,

key using hash(fname)

) engine=memory; 

表中有如下資料:

fname

lname

arjen

lentz

baron

schwartz

peter

zaitsev

vadim

tkachenko

假設索引使用假想的雜湊函式f(), 如下:

f('arjen') = 2323

f('baron') = 7437

f('peter') = 8784

f('vadim') = 2458

那麼雜湊索引的資料結構:

槽(slot)           值(value)

2323                     指向第1行的指標

2458                     指向第4行的指標

7437                     指向第2行的指標

8784                     指向第3行的指標

如果使用一條sql語句進行查詢:select lname from testhash where fname = 'peter'; 過程為:

計算『peter』的雜湊值(f('peter')=8784)----->查詢雜湊值對應的指標----->根據指標或得相應的資料。

雜湊索引的特點:索引的結構十分緊湊,因此查詢速度非常快;雜湊索引資料不是按照索引順序儲存的,無法用於排序;雜湊索引不支援部分索引列匹配查詢;雜湊索引只支援等值比較查詢(=,in(),<=>),不支援範圍查詢,如where price>100;

3. 全文索引

MySQL簡介 儲存引擎,索引型別,索引方法

查詢資料庫鎖支援的儲存引擎 9種,預設是innodb 索引型別 5種 索引方法 2種 show enginesq 常用的儲存引擎有哪些?a x,x等 q innodb跟myisam有什麼區別?a 這兩首先在磁碟儲存結構就不是不同的,可以去mysql的data檔案看一下,用innodb的表的結構是 表...

mysql索引儲存形式 MySql索引儲存形式

聚簇索引 聚集索引 非聚簇索引 非聚集索引 是因為儲存引擎不同引起的,儲存引擎中innodb是聚簇索引 myisam是非聚簇索引,聚簇索引是資料與索引儲存在乙個起,非聚簇索引資料乙個檔案 索引乙個檔案,資料與索引不在乙個檔案中。mysql的索引以b tree的資料結構儲存在磁碟,預設儲存引擎為inn...

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

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