資料庫索引

2021-09-26 15:46:34 字數 2905 閱讀 8078

為什麼要用索引?

當資料量較大時,避免將全表載入到記憶體,進行全表的掃瞄,加快查詢的速度和節約記憶體。這跟查字典的原理是一樣的,目錄就是索引,假如你查乙個漢字,肯定不會一頁一頁的查詢後面的正文吧。。。

b樹

b tree的規則:

一、根節點至少兩個孩子

二、每個節點至多m個孩子(m是樹的高度)

三、除了根節點和葉子節點外,其他節點至少有ceil(m / 2)個孩子

四、所有的葉子節點在同一層

五、關鍵字公升序

六、關鍵字比指標域少一

七、第乙個指標域指向的關鍵字小於第乙個關鍵字,最後乙個指標域指向的關鍵字大於最後乙個關鍵字,其他介於之間。

b+ trees索引

b+ tree規則:

一、指標域數量等於關鍵字數量

二、非葉子節點只用來索引,不存資料,資料都存在葉子節點中(主鍵id,指向檔案系統的指標)

三、葉子節點之間存在相連的指標

四、指標域pi指向的關鍵字位於[ki,ki+1)之間

為什麼選擇用b+樹做索引

一、樹比較矮,非葉子節點不存資料,只用來索引,大大減小磁碟i/o的次數,提高效能

二、葉子節點之間指標相連,支援範圍查詢

三、b+樹查詢穩定,都是從根節點到葉子節點。

hash索引的缺點

一、不支援範圍查詢

二、儲存的是hash值,hash值的排序不能代表原有值的排序

三、不支援部分索引鍵查詢,因為聯合索引存的是他們一起之後的hash值,跟將各個索引分別hash之後的值,沒有關係,並不是簡單的相加。

四、不能避免表掃瞄

詳解

主鍵索引

輔助索引

--建立主鍵,表的資料就按照上面b+樹的結構儲存在磁碟上,如果沒有主鍵, 會按照第乙個非空字段資料建立,如果沒有,會有乙個隱藏row_id來建立b+樹。

這就是聚集索引,葉子節點下面裝的就是資料頁。建立索引的目的就是排序表中的資料

create indx_bcd on t1(b,c,d);

--輔助索引,會構建出另外一顆b+樹,來輔助查詢,是按照b,c,d欄位組合的大小排序,建立欄位的時候會指定字符集,後面會跟有比較的規則。

select * from t1 where a = 1;

--走主鍵索引,來查詢。

select * from t1 where b = 1 and c = 1 and d = 1;

--先走輔助索引找到主鍵值,再到主鍵索引中去查詢,找到資料頁(回表)。

最左匹配原則:最左優先,以最左邊的為起點任何連續的索引都能匹配上。同時遇到範圍查詢(>、

select * from t1 where b like '%12';

--走全表掃瞄

select * from t1 where b = 1;

--走輔助索引,回表找到資料頁

select * from t1 where b > 1;

--走全表掃表,理論上是可以先走輔助索引找b = 1,然後右邊的都是b > 1,但是回表的代價高,查詢優化器會判斷,走全表掃瞄。

select * from t1 where b = 1 and c = 1 and d = 1 and a > 1;

--會發現key_len = 15,證明用的是前面的聯合索引,不能同時用兩個索引。

select * from t1 where b = 1 and c = 1 and d = 1 or a > 1;

--會發現key_len = 19,用的是兩個索引(組合索引),原因是在輔助索引比較大小的時候建立b+樹時,當輔助索引的資料相等時,不能比較大小,sql會做優化將主鍵索引放到一起,見下圖的組合索引

select * from t1 where b = 1 and b like '%1%';

--只能走b = 1索引,先走輔助索引,回表(innodb引擎),到service做 b like '%1%'

可以優化,先走輔助索引,做 b like '%1%',回表,找到資料頁,這叫做索引條件下推(push)

select b from t1;

--理論上有兩種走法,全表掃瞄,或者覆蓋索引(輔助索引裡面的索引中含有要查詢的資料),查詢優化器,會選擇走覆蓋索引,因為輔助索引的葉子節點下面裝的主鍵值,一頁可以裝很多索引,查詢較快。

組合索引

加了索引還是慢,該怎麼辦?

檢視索引的選擇性,優化索引

多表聯合查詢提高join buffer空間大小

select * from t1 join t2 on t1.a = t2.a;查詢優化器會優化,都是小表驅動大表完成查詢,

例如t1是小表,t2是大表,先在t1表裡面找a,然後將查詢結果放到join buffer,再到t2表中去查詢

分庫分布

讀寫分類

加快取

資料庫 資料庫索引

索引是儲存引擎用於快速找到記錄的一種資料結構。索引以檔案的形式儲存在磁碟中。索引可以包含乙個或多個列的值。儲存引擎查詢資料的時候,先在索引中找對應值,然後根據匹配的索引記錄找到對應的資料行。1.b tree索引 2.雜湊索引 myisam和innodb儲存引擎 只支援btree索引,也就是說預設使用...

資料庫mysql索引 資料庫 mysql索引

mysql 索引 mysql索引的建立對於mysql的高效執行是很重要的,索引可以大大提高mysql的檢索速度。打個比方,如果合理的設計且使用索引的mysql是一輛蘭博基尼的話,那麼沒有設計和使用索引的mysql就是乙個人力三輪車。索引分單列索引和組合索引。單列索引,即乙個索引只包含單個列,乙個表可...

資料庫索引

索引 索引列唯一索引 主鍵索引 聚簇索引和非聚簇索引 如何建立索引 如何刪除索引 使用索引可快速訪問資料庫表中的特定資訊。索引是對資料庫表中一列或多列的值進行排序的一種結構,例如 employee 表的姓 lname 列。如果要按姓查詢特定職員,與必須搜尋表中的所有行相比,索引會幫助您更快地獲得該資...