innodb儲存引擎支援以下幾種常見的索引:
b+樹索引
全文索引
雜湊索引
其中,innodb支援的索引是只適應的,不能人為的干預是否在一張表中生成雜湊索引。
資料庫的b+樹索引可以分為聚集索引和輔助索引,但是不管是聚集還是輔助的索引,其內部都是b+樹的,即高度平衡的,葉子節點存放著所有的資料。聚集索引與輔助索引不同的是,葉子節點存放的是否是一整行的資訊。
聚集索引就是按照每張表的主鍵構造一顆b+樹,同時葉子節點中存放的即為整張表的行記錄資料,也將聚集索引的葉子節點稱為資料頁。聚集索引的這個特性決定了索引組織表中資料也是索引的一部分。同b+資料結構一樣,每個資料頁都通過乙個雙向鍊錶來進行鏈結。
由於實際的資料頁只能按照一顆b+樹進行排序,因此每張表只能擁有乙個聚集索引。在大多數情況下,查詢優化器傾向於採用聚集索引。因為聚集索引能夠在b+樹索引的葉子節點上直接找到資料。此外,由於定義了資料的邏輯順序,聚集索引能特別快的訪問針對範圍值的查詢。
查詢優化器能夠快速發現某一段範圍的資料頁需要掃瞄。
對於輔助索引(secondary index,也稱非聚集索引),葉子節點並不包含行記錄的全部資料。葉子節點除了包含鍵值以外,每個葉子節點中的索引行中還包含了乙個書籤(bookmark)。該書籤用來告訴innodb儲存引擎**可以找到與索引相對應的行資料。
由於innodb儲存引擎表是索引組織表,因此innodb儲存引擎的輔助索引的書籤就是相應行資料的聚集索引鍵。
輔助索引的存在並不影響資料在聚集索引中的組織,因此每張表上可以有多個輔助索引。當通過輔助索引來尋找資料時,innodb儲存引擎會遍歷輔助索引並通過葉級別的指標獲得指向主鍵索引的主鍵,然後再通過主鍵索引來找到乙個完整的行記錄。
oltp的索引效果高於olap,olap上的索引更複雜,需要分析研究複雜語句。
聯合索引
比如有列a,b,c。構建索引 key idx_ab(a,b)。這個時候使用where查詢條件的時候where a=1 and b=2,可以會用到索引,where a=2,也可以使用索引。但where b=3就不會使用到索引了,因為在構建b+數的時候,a列是按順序構建的,b列是雜湊無序的。
聯合索引的支援的順序的,假如索引是(a,b,c)則查詢條件中用到a;a,b;a,b,c 都會用到索引,但出現跳躍式的a,c則不會用到索引,或索引的效果不大。因為索引的構造是先按a排序,再按b排序,最後按c排序。
覆蓋索引
innodb儲存引擎支援覆蓋索引,即從輔助索引中就可以得到查詢的記錄,而不需要查詢聚集索引中的記錄。使用覆蓋索引的乙個好處是輔助索引不包含整行記錄的所有資訊,故其大小要遠小於聚集索引,因此可以減少大量的io操作。
全文檢索
mysql資料庫支援全文檢索(full-text search)的查詢,其語法為:
match (col1
,col2
,...) against (expr
[search_modifier
])
search_modifier:
match 指定了需要被查詢的列,against指定了使用何種方法去進行查詢。下面將對各種查詢模式進行詳細的介紹。
1、natural language
全文檢索通過match函式進行查詢,預設查用natural language模式,其表示查詢帶有指定word的文件。
select * from fts_a where body like '%pease%';
顯然上述sql語句不能使用b+樹索引。若採用全文索引技術,可以用下面的sql語句進行查詢:
select * from fts_a where match(body) against ('porridge' in natural language mode);
一般使用預設。省略後面的修飾符
2、boolean
使用該修飾符的時候查詢的字串有特殊的含義。
3、query expansion
mysql 索引與優化 之 索引演算法
mysql 索引與優化 之 索引演算法 普通索引 index 主鍵索引 primary key 唯一索引 unique 全文索引 fulltext 1 btree 二叉樹 索引 1 2 3 4 5 6 7 42 6 1 3 5 7 2 hash 啥希 索引 中,國,人,民 雜湊演算法 中 005 國...
MySQL技術內幕 五 索引與演算法
一 索引概述 innodb支援兩種常見索引,一種是b 樹索引一種是雜湊索引。雜湊索引是自適應的,引1擎會根據表的使用情況自動為表生成雜湊索引,不能人為干預是否在一張表裡生成雜湊索引 b 樹索引就是傳統意義上的索引,這是關係型資料庫中最常用 有效的索引 b 樹索引的構造類似於二叉樹,根據鍵值快速找到資...
資料結構與演算法分析 索引
算法和資料結構是電腦科學的核心內容。作為程式猿,程式設計是我們的實戰專案。然而,寫出程式還不夠。乙個程式在應對一些大型而複雜的情況時。會耗費大量的時間。我們能夠非常easy寫出乙個從檔案裡找到乙個詞的程式。比方逐詞掃瞄。看是否相符。但假設我們的檔案有幾十tb,並且要從檔案裡找到上百個詞,逐個掃瞄的辦...