Mysql 的InnoDB引擎下支持hash索引嗎?

Mysql 的InnoDB引擎下支持hash索引嗎?

什麼,這個不是很明顯支持的嗎?還總是被面試官問到hash索引的btree索引有什麼區別?

那麼真的支持嗎?

 

場景

很多人可能在使用Navicat給表創建索引時會發現,索引方法中支持BTREE和HASH

 


乍一看,很多人的第一反應是,這不是支持hash索引嗎?

實踐

那麼我們來實踐一下。

CREATE TABLE `auth_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `username` varchar(20) DEFAULT NULL COMMENT '用戶名',
  `password` varchar(20) DEFAULT NULL COMMENT '密碼',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;

 

對應sql語句:
ALTER TABLE oauth.auth_user
ADD INDEX index1(username) USING HASH COMMENT '測試hash索引';

保存成功,表的DML語句變爲:

CREATE TABLE `auth_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `username` varchar(20) DEFAULT NULL COMMENT '用戶名',
  `password` varchar(20) DEFAULT NULL COMMENT '密碼',
  PRIMARY KEY (`id`),
  KEY `index1` (`username`) USING HASH COMMENT '測試hash索引'
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;

很多人可能會立刻說,這不是創建成功了嗎?

我們繼續,重新打開數據庫連接,打開表設計,會發現index1索引的索引方法變成了btree,

 

但是表定義語句還是沒有變化,

CREATE TABLE `auth_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵',
  `username` varchar(20) DEFAULT NULL COMMENT '用戶名',
  `password` varchar(20) DEFAULT NULL COMMENT '密碼',
  PRIMARY KEY (`id`),
  KEY `index1` (`username`) USING HASH COMMENT '測試hash索引'
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;

那麼這時,索引index1到底是btree索引還是hash索引呢?
通過命令查看錶auth上的索引信息

show index from auth_user;

 


發現主鍵索引和index1索引的index_type都是btree,說明創建的hash索引是沒有生效的。

 

分析:
查一下mysql官方文檔:https://dev.mysql.com/doc/refman/5.7/en/create-index.html,

 


從上面的圖中可以得知,InnoDB和MyISAM只支持BTree索引。

 

我們具體查一下InnoDB文檔那一部分:https://dev.mysql.com/doc/refman/5.7/en/innodb-introduction.html。

 


可以發現InnoDB支持的所有特性,其中對Hash index特徵的支持描述是:
No (InnoDB utilizes hash indexes internally for its Adaptive Hash Index feature.)
翻譯過來:
不支持(InnoDB在內部利用hash索引來實現其自適應hash索引特性)

 

那麼什麼是Adaptive Hash Index呢?

 


根據文件,不難發現,自適應索引是InnoDB引擎的內存結構中的一種特性。
對自適應hash索引的描述:
自適應hash索引特性使InnoDB能夠在具有適當的工作負載和足夠的緩衝池內存的系統上執行更像內存中的數據庫,而不犧牲事務特性或可靠性。
總的來說就是提高了查詢性能。

 

那麼怎樣啓動自適應hash索引的特性呢?
14.15 InnoDB Startup Options and System Variables
System variables that are true or false can be enabled at server startup by naming them, or disabled by using a --skip- prefix. For example, to enable or disable the InnoDB adaptive hash index, you can use --innodb-adaptive-hash-index or --skip-innodb-adaptive-hash-index on the command line, or innodb_adaptive_hash_index or skip_innodb_adaptive_hash_index in an option file.

翻譯過來就是可以在啓動命令中,加上--innodb-adaptive-hash-index就可以開啓InnoDB 自適應索引的特性了。

其實【MySQL技術內幕InnoDB存儲引擎.姜承堯.掃描版】也提到了這點

 

總結:

Mysql InnoDB引擎不支持hash索引,但是在內存結構中有一個自適應hash索引,來提高查詢性能。

多看,多思,多實踐,多記錄,多交流,老萬教你吊打面試官。

 

更多精彩,關注我吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章