1. 程式人生 > >InnoDB和MyISAM是否支持hash索引

InnoDB和MyISAM是否支持hash索引

using 失望 默認 create comm gin mar 報錯 div

今天和同學探討說MySQL哪些存儲引擎支持hash索引,因為所看書籍MySQL版本和現有的MySQL版本有出入,故中間出了點歧義。所以就手動敲了一下代碼,測試了一下MySQL8.0中的存儲引擎是如何支持hash索引的。

我們都知道MySQL最常用的存儲引擎為InnoDB和MyISAM。它們默認的存儲引擎都是B-Tree(實質為B+Tree)。他們本身都是不支持hash索引的。但是我們在建表時給某些字段添加hash索引,或者後期為某表添加hash索引時,如果他們的存儲引擎為InnoDB或MyISAM,則sql腳本本身是不會報錯的,但是我們會發現,該hash索引字段的index_type仍然為BTREE。如果存儲引擎為Memory,因為這個引擎本是就是支持hash索引的,索引其hash索引字段的index_type自然為HASH。OK,say is one thing,coding is another thing.展示例子如下:

1、InnoDB測試用例:

已有users表,存儲引擎為InnoDB

1.1、為useraddress字段添加hash索引:

alter table users add index idx_hash_userAddress using hash(useraddress);

1.2、查看表定義:

show create table users;

結果如下:

CREATE TABLE `users` (    
    `id` int(7) NOT NULL AUTO_INCREMENT COMMENT 用戶ID,    
    `userName` varchar(50) DEFAULT
NULL COMMENT 用戶名, `userAge` int(11) DEFAULT NULL COMMENT 年齡, `userAddress` varchar(200) DEFAULT NULL COMMENT 家庭住址, `state_id` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `idx_state_id` (`state_id`), KEY `idx_hash_userAddress` (`userAddress`), FULLTEXT
KEY `userAddress` (`userAddress`,`userName`) ) ENGINE=InnoDB AUTO_INCREMENT=2016000010 DEFAULT CHARSET=utf8

可以看到我們剛剛創建的hash索引,後面並沒有using hash,所以依然是B-Tree索引。

1.3、查看表的索引:

show index from users; 

技術分享圖片

同時,我們還能發現InnoDB8.0是支持全文索引的,即為index_type為FULLTEXT的索引。

2、MyISAM測試用例:

2.1、建表:

create table testHashInMyisam(    
    views char(5) not NULL    
)engine=myisam 

2.2、查看表定義:

show create table testHashInMyisam;

結果如下:

CREATE TABLE `testHashInMyisam` (    
    `views` char(5) NOT NULL    
) ENGINE=MyISAM DEFAULT CHARSET=utf8 

2.3、為表添加hash索引:

alter table testHashInMyisam add index idx_hash_views using hash(views);

2.4、查看表定義:

show create table testHashInMyisam;

結果如下:

CREATE TABLE `testHashInMyisam` (
    `views` char(5) NOT NULL,
    KEY `idx_hash_views` (`views`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

2.5、查看表索引:

show index from testHashInMyisam

技術分享圖片

3、Memory測試用例:

3.1、建表:

create table testHashInMemory(    
    views char(5) not NULL    
)engine=Memory

3.2、查看建表語句:

show create table testHashInMemory;

結果如下:

CREATE TABLE `testHashInMemory` (    
    `views` char(5) NOT NULL    
) ENGINE=MEMORY DEFAULT CHARSET=utf8

3.3、給表添加hash索引

alter table testHashInMemory add index idx_hash_views using hash(views);

3.4、查看表定義:

show create table testHashInMemory;

結果如下:

CREATE TABLE `testHashInMemory` (    
    `views` char(5) NOT NULL,    
    KEY `idx_hash_views` (`views`) USING HASH    
) ENGINE=MEMORY DEFAULT CHARSET=utf8

3.5、查看表的索引:

show index from testHashInMemory;

技術分享圖片

不過也不要失望,雖然常見存儲引擎並不支持 Hash 索引,但 InnoDB 有另一種實現方法:自適應哈希索引。InnoDB 存儲引擎會監控對表上索引的查找,如果觀察到建立哈希索引可以帶來速度的提升,則建立哈希索引。

我們可以通過 SHOW ENGINE INNODB STATUS 來查看當前自適應哈希索引的使用狀況

InnoDB和MyISAM是否支持hash索引