前言
除了常見的普通索引,惟一索引,組合索引,你們還能說一下mysql中有哪些其餘類型的索引嗎?java
今天和你們一塊兒總結mysql中有哪些索引類型。mysql
1、mysql中有哪些索引類型?
聚簇索引 (Clustered Index)web
非聚簇索引sql
主鍵索引(PRIMARY KEY)數據庫
輔助索引(Secondary Indexes)緩存
HASH索引微信
BTREE索引數據結構
T-TREE索引工具
R-Tree索引性能
惟一索引 (UNIQUE Indexs)
普通索引 (Normal index)
全文索引 (FULLTEXT Indexes)
空間索引 (Spatial indexes)
組合索引 (Multiple-Column Indexes)
覆蓋索引
自適應hash索引(Adaptive Hash Index)
倒序索引 (Descending Indexes)
不可見索引(Invisible Indexes)
嚇了一跳吧,你說出了幾個索引類型。
2、索引類型說明
一、按索引是否包含數據來分類
聚簇索引:
將數據存儲與索引放到了一塊,找到索引也就找到了數據,不須要根據主鍵或行號去進行回表查詢。
非聚簇索引:
非聚簇索引就是指B+Tree的葉子節點上的data,並非數據自己,而是數據存放的地址。主索引和輔助索引沒啥區別,只是主索引中的key必定得是惟一的。主要用在MyISAM存儲引擎中.
MyISAM引擎使用B+Tree做爲索引結構,葉節點的data域存放的是數據記錄的地址。
二、按索引是否創建在主鍵上分類
主鍵索引:
在MySQL的主鍵上建立的索引就是主鍵索引,主鍵索引會自動建立,一個表只能有一個主鍵索引,同時主鍵索引也是惟一索引。
輔助索引:
在聚簇索引之上建立的索引稱之爲輔助索引,輔助索引訪問數據老是須要二次查找,非聚簇索引都是輔助索引,像複合索引、前綴索引、惟一索引,innodb中輔助索引葉子節點存儲的再也不是行的物理位置,而是鍵值和主鍵 ID。
注意:
InnoDB引擎支持聚簇索引,MyISAM引擎不支持聚簇索引。
因此,主鍵索引不必定是聚簇索引。
三、按索引的底層數據結構分類
HASH索引
Hash 索引的特性:
一、等值查詢較快,可是不穩定
二、不能使用範圍查詢
三、不能避免數據排序
四、不能利用組合索引的部分字段進行查詢
五、不支持模糊查詢
六、避免不了回表查詢
B+Tree索引
B+Tree索引的特性:
1.全部關鍵字都出如今葉子結點的鏈表中(稠密索引),且鏈表中的關鍵字剛好是有序的;
2.內節點不存儲data,只存儲key;葉子節點不存儲指針。
3.不可能在非葉子結點命中;
4.非葉子結點至關因而葉子結點的索引(稀疏索引),葉子結點至關因而存儲(關鍵字)數據的數據層;
五、B+Tree的每一個葉子節點增長一個指向相鄰葉子節點的指針,就造成了帶有順序訪問指針的B+Tree。作這個優化的目的是爲了提升區間訪問的性能
6.更適合文件索引系統;
mysql各個存儲引擎支持的索引類型:
四、按索引的常規功能分類
惟一索引 (UNIQUE Indexs)
要求索引列的全部值都只能出現一次,即必須惟一。
普通索引 (Normal index)
僅用來提升查詢速度,沒有其餘特性。
全文索引 (FULLTEXT Indexes)
MySQL能夠經過創建全文索引,利用查詢關鍵字和查詢列內容之間的相關度進行檢索,能夠利用全文索引來提升匹配的速度。好比實現全匹配模糊查詢。
可是實際場景測試mysql的全文索引性能很是不穩定,不建議生產環境使用。須要使用全文檢索的地方,仍是推薦使用Elasticsearch
空間索引 (Spatial indexes)
空間索引使用R樹,R樹是用於索引多維數據的專用數據結構。
這4類索引也是咱們可使用Navicat等客戶端工具,可以主動建立的4類索引。
五、按索引是否包含多個字段分類
多字段索引 (Multiple-Column Indexes)
也叫組合索引(composite indexes),即索引中包含多個表字段。
樣例語句:
CREATE TABLE test (
id INT NOT NULL,
last_name CHAR(30) NOT NULL,
1581Verifying Index Usage
first_name CHAR(30) NOT NULL,
PRIMARY KEY (id),
INDEX name (last_name,first_name)
);
六、其餘特性索引
T-TREE索引
BTREE索引由NDB存儲引擎實現爲T樹索引,算是BTREE索引在NDB存儲引擎中的升級實現。
R-Tree索引
從MySQL 8.0.12開始,R-Tree索引開始在SPATIAL索引中使用。
MySQL對空間列上的SPATIAL索引使用R-Trees進行二次分割。
自適應hash索引(Adaptive Hash Index)
是InnoDB存儲引擎中的內存結構的組成部分。
InnoDB存儲引擎會監控對錶上各索引頁的查詢,若是觀察到創建hash索引能夠提升查詢速度,則自動創建hash索引。這就是自適應哈希索引(Adaptive Hash Index,AHI)
AHI是經過緩存池的B+樹頁構造而來,所以創建的速度很快,並且不須要對整張表構建hash索引。
InnoDB存儲引擎會自動根據訪問的頻率和模式來自動的爲某些熱點也創建hash索引。
覆蓋索引
若是一個索引包含(或覆蓋)全部須要查詢的字段的值,稱爲‘覆蓋索引’。即只需掃描索引而無須回表。
這個概念很是重要,靈活運用對SQL優化很是有幫助。
好比這2個查詢語句,一樣是全匹配模糊查詢,第二個sql卻能使用索引。緣由是就是利用了覆蓋索引的概念,減小了回表查詢。
降序索引 (Descending Indexes)
從MySQL 8.0開始支持降序索引了。其實,從語法上,MySQL 4就支持了,但正如官方文檔所言,"they are parsed but ignored",實際建立的仍是升序索引。
MySQL支持降序索引:再也不忽略索引定義中的DESC,而是致使鍵值的降序存儲。
降序索引的意義:
若是一個查詢,須要對多個列進行排序,且順序要求不一致。在這種場景下,要想避免數據庫額外的排序-「filesort」,只能使用降序索引。
CREATE TABLE t (
c1 INT, c2 INT,
INDEX idx1 (c1 ASC, c2 ASC),
INDEX idx2 (c1 ASC, c2 DESC),
INDEX idx3 (c1 DESC, c2 ASC),
INDEX idx4 (c1 DESC, c2 DESC)
);
ORDER BY c1 ASC, c2 ASC -- optimizer can use idx1
ORDER BY c1 DESC, c2 DESC -- optimizer can use idx4
ORDER BY c1 ASC, c2 DESC -- optimizer can use idx2
ORDER BY c1 DESC, c2 ASC -- optimizer can use idx3
不可見索引
MySQL支持不可見索引;也就是說,優化器未使用的索引。該功能適用於除主鍵(顯式或隱式)之外的索引。
不可見的索引能夠測試刪除索引對查詢性能的影響,而無需
進行破壞性的更改,若是最終須要索引,則必須撤消該更改。降低和
對於大型表,從新添加索引可能會很是昂貴,而使其不可見和可見則是快速的就地操做。
簡單來講,就是可使索引不起做用,對查詢優化器不可見。通常在調試索引對查詢性能影響的時候使用。至關於索引的一個開關。
建立不可見索引的三種方式:
CREATE TABLE t1 (
i INT,
j INT,
k INT,
INDEX i_idx (i) INVISIBLE
) ENGINE = InnoDB;
CREATE INDEX j_idx ON t1 (j) INVISIBLE;
ALTER TABLE t1 ADD INDEX k_idx (k) INVISIBLE;
修改一個索引的可見性:
ALTER TABLE t1 ALTER INDEX i_idx INVISIBLE;
ALTER TABLE t1 ALTER INDEX i_idx VISIBLE;
總結
本文比較全面的介紹了mysql中索引類型。
你還知道Mysql中哪些其餘的索引類型,歡迎留言交流。
更多精彩,關注我吧。
本文分享自微信公衆號 - 跟着老萬學java(douzhe_2019)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。