MySQL中的索引

2021-10-18 05:33:58 字數 2845 閱讀 4572

mysql官方對索引的定義為:索引(index)是幫助mysql高效獲取資料的資料結構(有序)。在資料之外,資料庫系統還維護著滿足特定查詢演算法的資料結構,這些資料結構以某種方式引用(指向)資料,這樣就可以在這些資料結構上實現高階查詢演算法,這種資料結構就是索引。如下圖所示:

一般來說索引本身也很大,不可能全部儲存在記憶體中,因此索引往往以索引檔案的形式儲存在磁碟上。建立索引是資料庫中用來提高效能的最常用的方式。

建立了索引優點自然是提高了查詢資料的效率,節省了時間,但缺點就是,首先也是占用了一定的空間,其次當進行一些表的更新操作時比方說插入,更新等,不僅要對錶進行操作,對索引也需要進行維護和修改,就變得稍微麻煩了。

b+樹 是 b樹的變種,也就是一棵多路平衡搜尋樹,b+樹 與 b樹 的區別為:

如上圖,就是一顆典型的b+ tree,乙個節點擁有n個子節點,那麼就擁有n個key。同時非葉子節點僅具有充當索引的作用,不存放跟記錄有關的資訊。樹的所有葉子節點構成乙個有序鍊錶,可以按照key排序依次遍歷全部記錄。

為什麼是b+樹而不是b樹?

innodb儲存引擎支援的雜湊索引是自適應的,innodb儲存引擎會根據表的使用情況自動為表生成雜湊索引,不能人為干預是否在一張表中生成雜湊索引。

注意

另乙個常常被dba忽視的問題是:b+樹索引並不能找到乙個給定鍵值的具體行。b+樹索引能找到的只是被查詢資料行所在的頁。然後資料庫通過把頁讀入到記憶體,再在記憶體中進行查詢,最後得到要查詢的資料。

innodb儲存引擎表是索引組織表,即表中資料按照主鍵順序存放。而聚集索引(clustered index)就是按照每張表的主鍵構造一棵b+樹,同時葉子節點中存放的即為整張表的行記錄資料,也將聚集索引的葉子節點稱為資料頁。聚集索引的這個特性決定了索引組織表中資料也是索引的一部分。同b+樹資料結構一樣,每個資料頁都通過乙個雙向鍊錶來進行鏈結,另一點是每個頁中的記錄也是通過雙向鍊錶進行維護的。

由於實際的資料頁只能按照一棵b+樹進行排序,因此每張表只能擁有乙個聚集索引。在多數情況下,查詢優化器傾向於採用聚集索引。因為聚集索引能夠在b+樹索引的葉子節點上直接找到資料。此外,由於定義了資料的邏輯順序,聚集索引能夠特別快地訪問針對範圍值的查詢。查詢優化器能夠快速發現某一段範圍的資料頁需要掃瞄。

對於輔助索引(secondary index,也稱非聚集索引),葉子節點並不包含行記錄的全部資料。葉子節點除了包含鍵值以外,每個葉子節點中的索引行中還包含了乙個書籤(bookmark)。該書籤用來告訴innodb儲存引擎**可以找到與索引相對應的行資料。

輔助索引的存在並不影響資料在聚集索引中的組織,因此每張表上可以有多個輔助索引。當通過輔助索引來尋找資料時,innodb儲存引擎會遍歷輔助索引並通過葉級別的指標獲得指向主鍵索引的主鍵,然後再通過主鍵索引來找到乙個完整的行記錄。舉例來說,.如果在一棵高度為3的輔助索引樹中查詢資料,那需要對這棵輔助索引樹遍歷3次找到指定主鍵,如果聚集索引樹的高度同樣為3,那麼還需要對聚集索引樹進行3次查詢,最終找到-乙個完整的行資料所在的頁,因此一共需要6次邏輯io訪問以得到最終的乙個資料頁。

聯合索引是指對錶上的多個列進行索引。

innodb儲存引擎支援覆蓋索引(covering index,或稱索引覆蓋),即從輔助索引中就可以得到查詢的記錄,而不需要查詢聚集索引中的記錄。使用覆蓋索引的乙個好處是輔助索引不包含整行記錄的所有資訊,故其大小要遠小於聚集索引,因此可以減少大量的io操作。

雜湊演算法是一種常見演算法,時間複雜度為о(1),且不只存在於索引中,每個資料庫應用中都存在該資料庫結構。設想乙個問題,當前伺服器的記憶體為128gb時,使用者怎麼從記憶體中得到某乙個被快取的頁呢?雖然記憶體中查詢速度很快,但是也不可能每次都要遍歷所有記憶體來進行查詢,這時對於字典操作只需о(1)的雜湊演算法就有了很好的用武之地。

雜湊表技術很好地解決了直接定址遇到的問題,但是這樣做有乙個小問題,兩個關鍵字可能對映到同乙個槽上。一般將這種情況稱之為發生了碰撞(collision)。在資料庫中一般採用最簡單的碰撞解決技術,這種技術被稱為鏈結法( chaining)。

在鏈結法中,把雜湊到同一槽中的所有元素都放在乙個鍊錶中,槽j中有乙個指標,它指向由所有雜湊到j的元素構成的鍊錶的頭;如果不存在這樣的元素則j中為null。

最後要考慮的是雜湊函式。雜湊函式h必須可以很好地進行雜湊。最好的情況是能避免碰撞的發生。即使不能避免,也應該使碰撞在最小程度下產生。一般來說,都將關鍵字轉換成自然數,然後通過除法雜湊、乘法雜湊或全域雜湊來實現。資料庫中一般採用除法雜湊的方法。

在雜湊函式的除法雜湊法中,通過取k除以m的餘數,將關鍵字k對映到m個槽的某乙個去,即雜湊函式為:

h (k) = k mod m

自適應雜湊索引採用之前討論的雜湊表的方式實現。不同的是,這僅是資料庫自身建立並使用的,dba本身並不能對其進行干預。自適應雜湊索引經雜湊函式對映到乙個雜湊表中,因此對於字典型別的查詢非常快速,但對於範圍查詢就無能為力了。

全文檢索(full-text search)是將儲存於資料庫中的整本書或整篇文章中的任意內容資訊查詢出來的技術。它可以根據需要獲得全文中有關章、節、段、句、詞等資訊,也可以進行各種統計和分析。

全文檢索通常使用倒排索引(inverted index)來實現。倒排索引同b+樹索引一樣,也是一種索引結構。它在輔助表( auxiliary table)中儲存了單詞與單詞自身在乙個或多個文件中所在位置之間的對映。

MySQL索引,MySQL中索引的限制?

mysql中索引的限制 1 myisam儲存引擎引鍵的長度綜合不能超過1000位元組 2 blob和text型別的列只能建立字首索引 3 mysql目前不支援函式索引 4 使用!或者 的時候mysql不能使用索引 5 過濾字段使用了函式運算的時候如 abs key sum key 的時候mysql無...

mysql中的索引

mysql中的索引 什麼是索引?索引是對資料庫中某乙個表的資料進行排序,這種排序並不是真正的對錶中資料按照大小排序,而是另外再建立乙個索引檔案來存放包含btree資料結構,在資料結構中根據索引欄位的值排序,資料結構的值包括 索引欄位的值和索引對應資料行的位址。索引查詢就是先查詢這個索引檔案來獲得資料...

MySql中的索引

索引就是資料庫內部對某個表的所有資料預先進行的某種排序,以便於後面的快速查詢。作用 可以極大的加快資料的查詢速度 通常所謂的建立索引,就是指定乙個表的某個或某些字段作為 索引資料字段 就可以了,形式為 索引型別 要建立的索引的欄位名 create table if notexists 表名 欄位1,...