模型建立索引 MYSQL高階 索引

2021-10-16 02:26:01 字數 1683 閱讀 8026

hash索引

hash索引主要適用於等值查詢的場景,排序,模糊搜尋等場景並不適用

有序陣列

有序陣列可用於非等值查詢,排序等場景,但是由於寫資料時需要對陣列中的元素進行位移,所以一般用於靜態資料的場景

二叉樹

二叉樹模型能夠很好的解決寫操作多時索引的維護,並且支援模糊查詢,排序等操作

mysql中最常用的儲存引擎是innodb,innodb中常用的索引模型是b+樹(二叉樹的一種,實際上是n叉樹)。

使用n叉樹的好處

樹結構進行搜尋的時候,是一層一層進行搜尋的,也就是說樹的高度越高,搜尋的次數越多,如果資料量比較大,二叉樹的話高度會很高,所以採用n叉樹

b+樹原理

從圖中可以看出,b+樹的分叉上存的是一組範圍的資料,且可以有多個節點,例如現在插入一條資料4,此時4的索引應該是在3和5之間的,這時有兩種情況:

如果子節點允許的最大節點樹超過兩個,則將4放到3和5之間

如果子節點最多隻允許放兩個元素,那麼此時需要將3和5所在的節點**成兩個節點,然後再將資料放上去

對於上面說的第二種情況,就是頁**,就是將原本放在一頁的資料**成兩頁,此時的空間利用率變低了(因為有一些空位沒有使用)。

有頁**就有頁合併,當我們做刪除操作的時候,如果兩頁的資料都比較少,就可能會發生頁合併。

聚簇索引和二級索引(innodb)

聚簇索引即主鍵索引,二級索引即非主鍵索引,兩個索引的區別可以用下面這個圖來對比一下:

圖中id是主鍵索引,k為非主鍵索引,從圖中可以看出,它們的區別主要在葉子節點上,主鍵索引的葉子節點儲存的是真正的資料行,但是非主鍵索引的葉子節點儲存的是主鍵,在查詢上它們的乙個很大的區別是:

如果使用主鍵索引進行查詢,可以直接獲取到最後的資料

如果使用非主鍵索引進行查詢,只能獲取到id,還需要通過id再獲取到資料行,這個過程稱之為回表

覆蓋索引

非主鍵索引會多一次回表查詢,但是在一些場景下是可以避免回表的,就比如說查詢的字段和條件欄位都在索引上,那麼就不需要進行回表,這種場景下對應的索引叫覆蓋索引

左側原則

例如我們建立了乙個聯合索引(a,b,c),以後我們只使用a條件的時候或者使用a,b條件的時候也是能夠使用該索引的

索引下推

索引下推是mysql5.6版本後的乙個優化,例如現在有聯合索引(a,b),有乙個查詢sql:

select * from t where a like 'pre%' and b = 'field';
無索引下推是先通過聯合索引(a,b)篩選出a like 'pre%' 資料的id,然後回表遍歷符合條件的資料篩選出b='field'的資料後返回

有索引下推是通過聯合索引(a,b)篩選a like 'pre%'順便看看b是否也同時滿足條件,滿足才回表查詢

mysql索引模型 MySQL索引模型

資料庫索引的出現其實就是為了提高資料查詢的效率,就像書的目錄一樣。索引的常見模型 雜湊表陣列加鍊表實現,新增新資料較快,但是由於不是有序的,所以區間查詢速度是很慢的。雜湊表適用於只有等值查詢的場景,比如memcached及其他nosql引擎。有序陣列 有序陣列是講索引字段有序的存放在陣列中,所以在等...

mysql高階索引 Mysql高階 索引優化全解

是否會使用索引,是mysql的關鍵 1.sql效能下降原因查詢語句寫的不好,連線子查詢太多,沒有建索引等等 索引失效 關聯jion表過多 伺服器引數設定不合適2.索引優化 索引是什麼?索引就是一種排好序的查詢資料結構,常見模型有雜湊表 有序陣列 二叉搜尋樹 目前最常用的innodb引擎使用的模型是b...

(索引)建立MySQL索引

建立索引的必要性 主鍵預設是建立索引的,而且具有唯一性 合適地建立索引後比不建立索引,提高了查詢速度 建立索引的語法 簡單索引 可以有重複資料 create index indexname on tablename column name 1舉例子說明如 建立乙個資料表,設定一些初始的資料,然後採用...