mysql索引原理

2021-09-26 00:07:22 字數 1855 閱讀 6411

mysql讀取資料,遵從的是區域性性原理,即mysql讀取資料是以頁(預設12kb)為單位讀取的,可以一定程度上避免頻繁的讀取io。如select * form t where id=2 ,需要先通過io從磁碟以頁為單位讀取檔案到記憶體中,對頁中的資料進行分析,返回最終的資料。

區域性性原理:當需要讀取1kb的資料時會將其附近的資料一塊讀取,以減少磁碟的io。

頁中的資料不是鍊錶排序的原因:當鍊表過大時資料的查詢效率低下。

mysql索引為b+的原因:在目錄頁中,根據對應的索引可以迅速定位到資料存在的頁;隨後通過磁碟io,讀取對應的葉子節點,根據頁中的目錄可以迅速定位資料。

當使用輔助索引查詢資料時,如果需要的資料不能完全在輔助索引的結構中存在,此時需要再次讀取主鍵索引模型來查詢資料。

索引預設為從小到大的儲存規則,如果為char型別則使用對應的字元編碼集進行排序。

mysql5.8版本才支援索引的降序,5.7只支援索引的公升序

索引最左原則:t(a,b) 的索引,單獨的a索引可用,a-b的索引可用,但是b索引不可用

當列的資料越大時,頁上的資料量越小,這也就是為什麼需要將大字段單獨建表的原因。

普通索引模型下,一頁的資料量一般比主鍵模型下的資料量大,但是資訊卻不完整

mysql在建立表時,如果當前表沒有主鍵索引時,假定存在唯一索引則使用該索引來儲存資料,如果沒有索引則在表中建立了乙個隱藏列用於儲存資料,存在主鍵索引時則使用主鍵索引來儲存資料。這就是為什麼建立表時一般要建立主鍵索引的原因。

mysql中的資料是以頁為單位儲存的。當需要讀取檔案時,以頁為單位從磁碟讀取檔案到記憶體中。

頁目錄上的資料為,對應頁上的最小值-對應頁的位址。葉子節點為資料的儲存結構,對應的索引-其他資料。

當為主鍵索引的資料結構時,id-其他的列資料,此時為聚集索引,即列的資料全部在索引上。

當為普通索引的資料結構時,索引資料-主鍵索引資料,此時為非聚集索引。如在t(a,b)聯合索引下產生的資料結構,該結構中只包含了a,b,id列的資料,其他列的資料不存在。

a.select * from t where id=1

使用主鍵索引查詢並讀取資料        type-const

b.select * from t

使用主鍵索引模型下,從左到右的全表讀取資料,all

t表中id為主鍵索引,存在聯合索引(a,b),c為普通列

select * from t                         all 全表掃瞄

select * from t where id=1     const 主鍵索引

select * from t where id>1     all 全表掃瞄

select b from t where a=1     ref 輔助索引中獲取資料

select c from t where a=1     ref 輔助索引定位+主鍵索引中獲取資料

select b from t where a>1     range 輔助索引中獲取資料,範圍掃瞄

select c from t where a>1    

all 對主鍵索引的全表掃瞄。原因:若從輔助索引定位從主鍵索引獲取資料則需要多次查詢

MySQL索引原理之索引原理

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

mysql索引 mysql索引實現原理

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

mysql 索引原理

b樹 b樹高度 資料庫為什麼使用這種結構?一般來說,索引本身也很大,不可能全部儲存在記憶體中,因此索引往往以索引檔案的形式儲存的磁碟上。這樣的話,索引查詢過程中就要產生磁碟i o消耗,相對於記憶體訪問,i o訪問的消耗要高幾個數量級,所以評價乙個資料結構作為索引的優劣最重要的指標就是在查詢過程中磁碟...