mysql索引原理總結

2021-10-06 09:57:02 字數 3001 閱讀 5265

引擎聚集索引

輔助索引

聯合索引

命令單列索引

乙個索引只包含單個列,一張表可以有多個單列索引
組合索引

乙個索引包含多個列
查詢速度快

更新速度慢,不僅要更新資料,還要更新索引檔案

占用磁碟空間

hash、b+樹

b+樹是對資料進行排序,

再分組記錄,可以進行範圍查詢,支援排序,採用的是b+樹,時間是log

hash是直接計算hash值,

因此hash不支援範圍查詢,不支援排序

因為hash位址會衝突,需要再比較鍊錶的資料內容

當hash衝突少時,hash查詢比較快,時間是o(1)+o(logt)

b+:innodb、myisam

myisam表資料檔案與索引檔案時分離的,索引檔案只記錄記錄再磁碟中的儲存位址,可以不需要主鍵

innodb有表資料的ibd檔案,表資料檔案就是主索引,葉節點的data域儲存了完整的資料資訊,按照主鍵聚集,所以要有主鍵,如果沒有定義的話,會採用隱藏列中的行id來作為主鍵

因為inndob的資料檔案要按照主鍵聚集,所以innodb要求表必須要有主鍵(myisam可以沒有),

如果沒有顯式定義,則mysql系統會自動選擇乙個可以唯一標識資料記錄的列作為主鍵,

如果不存在這種列,則mysql會自動為innodb表生成乙個隱含字段作為主鍵,這字段的長度為6個位元組,型別為長整型.

1、從磁碟中載入一頁資料,

2、在記憶體中通過二分查詢,

確定資料的範圍,鎖定第二頁的指標,

3、把第二頁載入到記憶體,再二分查詢,確定範圍,鎖定指標,

4、直到找到資料。

欄位要盡量小,當樹高度越高,就需要多次載入資料,搜尋效率比較低,所以欄位要盡量小,存的資料會比較多,減少佔的頁數

最左匹配特性,b+樹是採用從左到右的順序來建樹的,查詢是也是通過第乙個比較因子來確定搜尋範圍,如果沒有第乙個比較因子,就沒辦法確定從哪開始搜尋。如果有3個比較條件,只給了頭尾,可以第乙個採用索引確定下乙個要搜尋的節點,在對這個範圍的資料利用第3個比較條件進行匹配。

索引分成2類:

根據hash值進行定位,因為會有hash衝突,索引最後要把查詢的元素跟鍊錶中的元素做乙個匹配,得到結果,

當hash衝突比較少時,時間複雜度是o(1)

將資料進行排序,分組,分組是存在頁中,每頁中還要頁目錄,再用頁儲存頁號跟每一頁的主鍵的最小值,同一層的頁之間是雙向鍊錶,資料頁之間也是雙向鍊錶

本質:搜尋是通過減少搜尋範圍以及二分查詢可以提高查詢速度

因為cpu從磁碟每次都讀取一頁,當樹的高度比較高時,讀取的次數就會比較多,降低查詢速度,所以可以減少欄位的大小,使一頁中存放更多的資料,減少樹的高度

從左到右進行建樹,查詢時需要通過第乙個比較條件確定下一步搜尋範圍,如果沒有第乙個比較條件,就無法確定搜尋範圍,如果有第乙個跟最後乙個,會先確定搜尋範圍,然後對這個範圍的所有資料根據最後乙個比較條件進行匹配(這個就沒有索引了)

#不同的儲存引擎支援的索引型別也不一樣

innodb 支援事務,支援行級別鎖定,支援 b-tree、full-text 等索引,不支援 hash 索引;

myisam 不支援事務,支援表級別鎖定,支援 b-tree、full-text 等索引,不支援 hash 索引;

memory 不支援事務,支援表級別鎖定,支援 b-tree、hash 等索引,不支援 full-text 索引;

ndb 支援事務,支援行級別鎖定,支援 hash 索引,不支援 b-tree、full-text 等索引;

archive 不支援事務,支援表級別鎖定,不支援 b-tree、hash、full-text 等索引;

採用主鍵對每張表建立b+樹,就是用主鍵對資料進行排序

同一層的頁之間按照主鍵從左到右是雙向鍊錶

資料頁之間按照主鍵從左到右是雙向鍊錶

資料頁內的記錄按照主鍵從左到右是單向鍊錶

葉子節點儲存每一行的記錄

不需要用index語句去建立,innodb預設的資料儲存方式就是這種方式

查詢最後幾個時,雙向鍊錶可以倒序

查詢範圍時,葉節點的上層節點可與得到頁範圍

表中除了聚集索引外其他索引都是輔助索引(secondary index,也稱為非聚集索引)

用我們指定的索引列來排序

葉節點儲存的是主鍵跟索引列,

目錄頁儲存的不是主鍵跟頁號,是索引列跟主鍵、頁號

需要再通過主鍵到聚集索引查詢到記錄(回表)

目錄頁的記錄的唯一的

佔的空間小,可以減少頁,所以計較快

採用多個列來作為排序的規則,也是輔助索引

先按照前面的列進行排序,相同的話再考慮後面的列

普通索引

index:加速查詢

唯一索引:

主鍵索引primary key(不為空、不重複):加速查詢+約束

唯一索引unique:(不重複):加速查詢+約束

聯合索引:

聯合主鍵primary key(id+……)

聯合唯一unique(id+……)

聯合普通index(id+……)

建立表時建立

unique key id_id(id)

index id_name(name)

在已存在的表上建立

create index id_id on gyy5(message(20));

create index id_id on gyy5(name);

修改表結構時建立

alter table gyy5 add index age int;

刪除alter table gyy5 drop index ix_t;

drop index ix_m on gyy5;

檢視表結構

show columns from gyy5

MySQL索引原理之索引原理

索引定義 是儲存引擎用於快速查詢記錄的一種資料結構。需要額外開闢空間和資料維護工作。索引是物理資料頁儲存,在資料檔案中 innodb,ibd檔案 利用資料頁 page 儲存。索引可以加快檢索速度,但是同時也會降低增刪改操作速度,索引維護需要代價。索引涉及的理論知識 二分查詢法 hash和b tree...

mysql 索引總結 mysql索引總結

mysql中每乙個表都有乙個聚簇索引clusted index,該所索引是預設建立的,除此之外的表上的每乙個非聚簇索引都是二級索引,又叫輔助索引 secondary indexes 以innodb來說,每個innodb表具有乙個特殊的索引稱為聚集索引,如果您的表上定義有主鍵,該主鍵索引是聚集索引,如...

mysql索引 mysql索引實現原理

什麼是索引 索引是一種高效獲取資料的儲存結構,例 hash 二叉 紅黑。mysql為什麼不用上面三種資料結構而採用b tree 若僅僅是 select from table where id 45 上面三種演算法可以輕易實現,但若是select from table where id 6 就不好使了...