MySQL索引的分類(根據數據結構)mysql
MySQL官方對索引的定義爲:索引(Index)是幫助MySQL高效獲取數據的數據結構。提取句子主幹,就能夠獲得索引的本質:索引是數據結構。算法
數據庫查詢是數據庫的最主要功能之一。咱們都但願查詢數據的速度能儘量的快,所以數據庫系統的設計者會從查詢算法的角度進行優化。最基本的查詢算法固然是順序查找(linear search),這種複雜度爲O(n)的算法在數據量很大時顯然是糟糕的,好在計算機科學的發展提供了不少更優秀的查找算法,例如二分查找(binary search)、二叉樹查找(binary tree search)等。若是稍微分析一下會發現,每種查找算法都只能應用於特定的數據結構之上,例如二分查找要求被檢索數據有序,而二叉樹查找只能應用於二叉查找樹上,可是數據自己的組織結構不可能徹底知足各類數據結構(例如,理論上不可能同時將兩列都按順序進行組織),因此,在數據以外,數據庫系統還維護着知足特定查找算法的數據結構,這些數據結構以某種方式引用(指向)數據,這樣就能夠在這些數據結構上實現高級查找算法。這種數據結構,就是索引。sql
索引有不少種類型,能夠爲不一樣的場景提供更好的性能。在mysql中,索引是在存儲引擎層而不是服務器層實現的。數據庫
因此,並無統一的標準:不一樣存儲引擎的索引的工做方式並不同,也不是全部的存儲引擎都支持全部類型的索引。即便多個存儲引擎支持同一種類型的索引,其底層的實現也可能不一樣。服務器
索引是在MYSQL的存儲引擎層中實現的,而不是在服務層實現的。因此每種存儲引擎的索引都不必定徹底相同,也不是全部的存儲引擎都支持全部的索引類型。MYSQL目前提供了一下4種索引。數據結構
B-Tree 索引:最多見的索引類型,大部分引擎都支持B樹索引。函數
HASH 索引:只有Memory引擎支持,使用場景簡單。post
R-Tree 索引(空間索引):空間索引是MyISAM的一種特殊索引類型,主要用於地理空間數據類型。性能
Full-text (全文索引):全文索引也是MyISAM的一種特殊索引類型,主要用於全文索引,InnoDB從MYSQL5.6版本提供對全文索引的支持。優化
當人們在談論索引的時候,若是沒有指定類型,那麼多半說的是B-Tree索引,它使用B-Tree數據結構來存儲數據。(InnoDB使用的是B+Tree)
B-Tree索引可以加快訪問數據的速度,由於存儲引擎再也不須要進行全表掃描來獲取須要的數據,取而代之的是從索引的根節點開始進行搜索。根節點的槽中存放了指向子節點的指針,存儲引擎根據這些指針向下層查找。經過比較節點頁的值和要查找的值能夠找到合適的指針進入下層子節點,這些指針實際上定義了子節點頁中值的上限和下限。最終存儲引擎要麼是找到對應的值,要麼該記錄不存在。
詳見http://my.oschina.net/xinxingegeya/blog/308484
MyISAM表支持空間索引,能夠用作地理數據存儲。和B-Tree索引不一樣,這類索引無須前綴查詢。空間索引會從全部維度來索引數據。查詢時,能夠有效地使用任意維度來組合查詢。必須使用mysql的GIS相關函數如MBRCONTAINS()等來維護數據。mysql的GIS支持並不完善,因此大部分人都不會使用這個特性。開源數據庫中對GIS的解決方案作的比較好的是PostgreSQL的postGIS。
全文索引是一種特殊類型的索引,他查找的是文本中的關鍵詞,而不是直接比較索引中的值。全文索引和其餘幾類索引的匹配方式徹底不同。他有許多須要注意的細節,如停用詞、詞幹和複數、布爾搜索等。全文索引更相似與搜索引擎作的事情,而不是簡單的where條件匹配。
在相同的列上同時建立全文索引和基於值的B-Tree索引不會有衝突,全文索引適用於MATCH AGAINST操做,而不是普通的where條件操做。
==============END==============