索引實際上是一種數據結構,可以幫助咱們快速的檢索數據庫中的數據數據庫
常見的MySQL主要有兩種結構:Hash索引和B+ Tree索引, InnoDB引擎,默認的是B+樹。數據結構
Hash索引和B+ Tree索引 優缺點:排序
哈希表是一種以key-value存儲數據的結構,因此多個數據在存儲關係上是徹底沒有任何順序關係的, 因此,對於區間查詢是沒法直接經過索引查詢的,就須要全表掃描。因此,哈希索引只適用於等值查詢的場景。索引
而B+ Tree是一種多路平衡查詢樹,因此他的節點是自然有序的(左子節點小於父節點、父節點小於右子節點),因此對於範圍查詢的時候不須要作全表掃描。效率
哈希索引沒辦法利用索引完成排序 哈希索引不支持多列聯合索引的最左匹配規則 若是有大量重複鍵值得狀況下,哈希索引的效率會很低,由於存在哈希碰撞問題數據
索引B+ Tree的葉子節點存儲了整行數據的是主鍵索引,也被稱之爲聚簇索引。查詢
而索引B+ Tree的葉子節點存儲了主鍵的值的是非主鍵索引,也被稱之爲非聚簇索引。哈希表
區別:聚簇索引查詢會更快,由於主鍵索引樹的葉子節點直接就是咱們要查詢的整行數據了。而非主鍵索引的葉子節點是主鍵的值,查到主鍵的值之後,須要回表查詢屢次模型
覆蓋索引 :
指一個查詢語句的執行只用從索引中就可以取得,沒必要從數據表中讀取。也能夠稱之爲實現了索引覆蓋。
當一條查詢語句符合覆蓋索引條件時,MySQL只須要經過索引就能夠返回查詢所須要的數據,這樣避免了查到索引後再返回表操做,減小I/O提升效率。
在建立多列索引時,咱們根據業務需求,where子句中使用最頻繁的一列放在最左邊,由於MySQL索引查詢會遵循最左前綴匹配的原則,即最左優先,
在檢索數據時從聯合索引的最左邊開始匹配。因此當咱們建立一個聯合索引的時候,如(key1,key2,key3),至關於建立了(key1)、(key1,key2)和(key1,key2,key3)三個索引,這就是最左匹配原則。