想必你們在被問到這個問題的時候,在網上老是能搜到不一樣的回答,卻又各不相同。其實這些答案大部分都是正確的,只不過在闡述MySQL索引類型的時候從不一樣方面入手而已。這裏概括以下,具體的機制能夠參考其餘博文:html
B+樹索引(O(log(n))):關於B+樹索引,能夠參考 MySQL索引背後的數據結構及算法原理mysql
FULLTEXT索引(如今MyISAM和InnoDB引擎都支持了)算法
R-Tree索引(用於對GIS數據類型建立SPATIAL索引)sql
彙集索引(clustered index)數據結構
非彙集索引(non-clustered index)spa
主鍵索引:主鍵索引是一種特殊的惟一索引,不容許有空值code
普通索引或者單列索引htm
多列索引(複合索引):複合索引指多個字段上建立的索引,只有在查詢條件中使用了建立索引時的第一個字段,索引纔會被使用。使用複合索引時遵循最左前綴集合blog
惟一索引或者非惟一索引索引
空間索引:空間索引是對空間數據類型的字段創建的索引,MYSQL中的空間數據類型有4種,分別是GEOMETRY、POINT、LINESTRING、POLYGON。
MYSQL使用SPATIAL關鍵字進行擴展,使得可以用於建立正規索引類型的語法建立空間索引。建立空間索引的列,必須將其聲明爲NOT NULL,空間索引只能在存儲引擎爲MYISAM的表中建立
CREATE TABLE table_name[col_name data type] [unique|fulltext|spatial][index|key][index_name](col_name[length])[asc|desc]
參數解析:
一、unique|fulltext|spatial爲可選參數,分別表示惟一索引、全文索引和空間索引; 二、index和key爲同義詞,二者做用相同,用來指定建立索引 三、col_name爲須要建立索引的字段列,該列必須從數據表中該定義的多個列中選擇; 四、index_name指定索引的名稱,爲可選參數,若是不指定,MYSQL默認col_name爲索引值; 五、length爲可選參數,表示索引的長度,只有字符串類型的字段才能指定索引長度; 六、asc或desc指定升序或降序的索引值存儲