mysql索引模型 MySQL索引模型

2021-10-17 15:30:54 字數 2177 閱讀 1236

資料庫索引的出現其實就是為了提高資料查詢的效率,就像書的目錄一樣。

索引的常見模型

雜湊表陣列加鍊表實現,新增新資料較快,但是由於不是有序的,所以區間查詢速度是很慢的。

雜湊表適用於只有等值查詢的場景,比如memcached及其他nosql引擎。

有序陣列

有序陣列是講索引字段有序的存放在陣列中,所以在等值查詢和範圍查詢場景中的效能就都非常優秀。

但是有序陣列在插入更新時就比較麻煩,需要移動後面所有記錄,成本太高;所以有序陣列索引只適用於靜態儲存引擎。

二叉搜尋樹

二叉樹的查詢和更新複雜度均為o(log(n));假如一棵 100 萬節點的平衡二叉樹,樹高 20,一次查詢可能需要訪問 20 個資料塊。

所以大多數資料儲存引擎採用n叉樹

mysql的索引

在mysql中,索引是在儲存引擎層實現的。mysql索引使用的資料結構主要有btree索引和雜湊索引。對於雜湊索引來說,底層的資料結構就是雜湊表,因此在絕大多數需求為單條記錄查詢的時候,可以選擇雜湊索引,查詢效能最快;其餘大部分場景,建議選擇btree索引。

myisam中的索引

b+tree葉節點的data域存放的是資料記錄的位址。在索引檢索的時候,首先按照b+tree搜尋演算法搜尋索引,如果指定的key存在,則取出其data域的值,然後以data域的值為位址讀取相應的資料記錄。這被稱為「非聚簇索引」。

innodb中的索引

表都是根據主鍵順序以索引的形式存放的,其表資料檔案本身就是按b+tree組織的乙個索引結構,樹的葉節點data域儲存了完整的資料記錄。這個索引的key是資料表的主鍵,因此innodb表資料檔案本身就是主索引。

主鍵索引的葉子節點存的是整行資料。在 innodb 裡,主鍵索引也被稱為聚簇索引(clustered index)。

非主鍵索引的葉子節點內容是主鍵的值。在 innodb 裡,非主鍵索引也被稱為二級索引(secondary index)。

根據非主鍵索引查詢到主鍵,再根據主鍵找到記錄的過程我們稱為回表;基於非主鍵索引的查詢需要多掃瞄一棵索引樹。因此,我們在應用中應該盡量使用主鍵查詢。

在根據主索引搜尋時,直接找到key所在的節點即可取出資料;在根據輔助索引查詢時,則需要先取出主鍵的值,在走一遍主索引。 因此,在設計表的時候,不建議使用過長的字段作為主鍵,也不建議使用非單調的字段作為主鍵,這樣會造成主索引頻繁**。

覆蓋索引

sql只需要通過索引就可以返回查詢所需要的資料,而不必通過二級索引查到主鍵之後再去查詢資料。

對於以上這張表,我們查詢select uid from group_user where gid = 2 order by create_time asc limit 10。

首先,該語句order by 使用了using filesort檔案排序,查詢效率低;其次,查詢欄位不在索引上,沒有使用覆蓋索引,需要通過索引回表查詢;也有資料分布的原因。

解決方案:alert table group_user add index idx_uid_gid_ctime (uid, gid, create_time)

由於只需查詢uid欄位,新增乙個聯合索引便可以避免回表和檔案排序,利用覆蓋索引提公升查詢速度,同時利用索引完成排序。

最左字首原則

b+ 樹這種索引結構,可以利用索引的「最左字首」,來定位記錄。

在建立聯合索引的時候,如果通過調整順序,可以少維護乙個索引,那麼這個順序往往就是需要優先考慮採用的;如果既有聯合查詢又要各自查詢,那麼第二考慮的就是空間原則了。

索引下推

以市民表的聯合索引(name, age)為例。如果現在有乙個需求:檢索出表中「名字第乙個字是張,而且年齡是 10 歲的所有男孩」。

在mysql5.6之前,根據最左字首原則這個語句在搜尋索引樹的時候,只能用name欄位索引,innodb 並不會去看 age 的值。

而 mysql 5.6 引入的索引下推優化(index condition pushdown), 可以在索引遍歷過程中,對索引中包含的字段先做判斷,直接過濾掉不滿足條件的記錄,減少回表次數。

mysql 雜湊索引 MySQL索引之雜湊索引

雜湊索引 hash index 建立在雜湊表的基礎上,它只對使用了索引中的每一列的精確查詢有用。對於每一行,儲存引擎計算出了被索引的雜湊碼 hash code 它是乙個較小的值,並且有可能和其他行的雜湊碼不同。它把雜湊碼儲存在索引中,並且儲存了乙個指向雜湊表中的每一行的指標。在mysql中,只有me...

mysql主鍵索引 MySQL索引之主鍵索引

在mysql裡,主鍵索引和輔助索引分別是什麼意思,有什麼區別?上次的分享我們介紹了聚集索引和非聚集索引的區別,本次我們繼續介紹主鍵索引和輔助索引的區別。1 主鍵索引 主鍵索引,簡稱主鍵,原文是primary key,由乙個或多個列組成,用於唯一性標識資料表中的某一條記錄。乙個表可以沒有主鍵,但最多只...

mysql聚集索引 MySQL索引之聚集索引介紹

在mysql裡,聚集索引和非聚集索引分別是什麼意思,有什麼區別?在mysql中,innodb引擎表是 聚集 索引組織表 clustered index organize table 而myisam引擎表則是堆組織表 heap organize table 也有人把聚集索引稱為聚簇索引。當然了,聚集索...