InnoDB和MyISAM是否支持hash索引

摘要:
哈希索引字段的索引_类型仍然是BTREE。索引其哈希索引字段_类型自然是hash`userName`))ENGINE=InnoDB自动_增量=2016000010DEFAULTCHARSET=utf8您可以看到我们刚刚创建的哈希索引。

今天和同学探讨说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; 

InnoDB和MyISAM是否支持hash索引第1张

同时,我们还能发现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

InnoDB和MyISAM是否支持hash索引第2张

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;

InnoDB和MyISAM是否支持hash索引第3张

不过也不要失望,虽然常见存储引擎并不支持 Hash 索引,但 InnoDB 有另一种实现方法:自适应哈希索引。InnoDB 存储引擎会监控对表上索引的查找,如果观察到建立哈希索引可以带来速度的提升,则建立哈希索引。

我们可以通过 SHOW ENGINE INNODB STATUS 来查看当前自适应哈希索引的使用状况

免责声明:文章转载自《InnoDB和MyISAM是否支持hash索引》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇日期类型存储成字符串类型的格式问题使用WIFI准备工作及配置内核——韦东山下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

mysql binlog抽取某个表的数据

1.先把binlog文件转化为sql sudo mysqlbinlog /var/mysql/var/mysql-bin.000057 --base64-output=decode-rows -v > /var/mydiag.sql 2.抽取某一个表的数据 grep -B0 -A27 -w 'DELETE FROM `kdb`.`t_diag_re...

C++ 类的存储方式以及虚函数表

一、C++成员函数在内存中的存储方式   用类去定义对象时,系统会为每一个对象分配存储空间。如果一个类包括了数据和函数,要分别为数据和函数的代码分配存储空间。按理说,如果用同一个类定义了10个对象,那么就需要分别为10个对象的数据和函数代码分配存储单元,如下图所示。         能否只用一段空间来存放这个共同的函数代码段,在调用各对象的函数时,都去...

mysql分区方案的研究

笔者觉得,分库分表确实好的。但是,动不动搞分库分表,太麻烦了。分库分表虽然是提高数据库性能的常规办法,但是太麻烦了。所以,尝试研究mysql的分区到底如何。 之前写过一篇文章,http://www.cnblogs.com/wangtao_20/p/7115962.html 讨论过订单表的分库分表,折腾起来工作量挺大的,需要多少技术去折腾。做过的人才知道有多...

PostgreSQL中的Object Identifier(oid)数据类型

PostgreSQL在内部使用对象标识符(OID)作为各种系统表的主键。OID不会添加到用户创建的表中,除非在创建表时指定了WITH OIDS,或者启用了default_with_oids配置变量。类型oid表示对象标识符。oid还有几种别名类型:regproc,regprocedure,regoper,regoperator,regclass,regty...

Mysql学习总结(36)——Mysql查询优化

从事前端开发的都知道,页面显示的数据一定要及时的呈现,否则会影响用户体现.那么导致页面加载数据慢或者显示滞后的原因又是什么呢? 拿自己之前做项目经历给大家讲讲吧,之前做后台,当时的项目实时性都非常高,前端页面实时显示要求非常高 ,慢1秒显示都会导致用户的投诉,最后没办法,通过本地(磁盘)缓存跟数据表分割来解决这一问题. 原因分析 主要原因1: 后台数据库中...

【数据泵】EXPDP导出表结构

【数据泵】EXPDP导出表结构(真实案例) BLOG文档结构图         因工作需要现需要把一个生产库下的元数据(表定义,索引定义,函数定义,包定义,存储过程)导出到测试库上,本来以为很简单的,可是做的过程发现很多的问题,现记录如下,希望有同样需要的朋友不要再走弯路了。     导读 各位技术爱好者,看完本文后,你可以掌握如下的...