InnoDB和MyISAM是否支持hash索引

今天和同学探讨说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 来查看当前自适应哈希索引的使用状况

原文地址:https://www.cnblogs.com/yifanSJ/p/9170317.html

时间: 2024-10-27 05:54:13

InnoDB和MyISAM是否支持hash索引的相关文章

InnoDB关键特性之自适应hash索引

一.索引的资源消耗分析 1.索引三大特点 1.小:只在一个到多个列建立索引 2.有序:可以快速定位终点 3.有棵树:可以定位起点,树高一般小于等于3 2.索引的资源消耗点 1.树的高度,顺序访问索引的数据页,索引就是在列上建立的,数据量非常小,在内存中: 2.数据之间跳着访问 1.索引往表上跳,可能需要访问表的数据页很多: 2.通过索引访问表,主键列和索引的有序度出现严重的不一致时,可能就会产生大量物理读: 资源消耗最厉害:通过索引访问多行,需要从表中取多行数据,如果无序的话,来回跳着找,跳着访

警惕 InnoDB 和 MyISAM 创建 Hash 索引陷阱

MySql 常见存储引擎 InnoDB 和 MyISAM 都不支持 Hash 索引,它们默认的索引都是 B-Tree.但是如果你在创建索引的时候定义其类型为 Hash,MySql 并不会报错,而且你通过 SHOW CREATE TABLE 查看该索引也是 Hash,只不过该索引实际上还是 B-Tree.比如表 data_dict 的 DDL: CREATE TABLE `data_dict` ( `data_type` varchar(32) NOT NULL COMMENT '数据字典类型',

B-Tree 索引和 Hash 索引的对比

对于 B-tree 和 hash 数据结构的理解能够有助于预测不同存储引擎下使用不同索引的查询性能的差异,尤其是那些允许你选择 B-tree 或者 hash 索引的内存存储引擎. B-Tree 索引的特点 B-tree 索引可以用于使用 =, >, >=, <, <= 或者 BETWEEN 运算符的列比较.如果 LIKE 的参数是一个没有以通配符起始的常量字符串的话也可以使用这种索引.比如,以下 SELECT 语句就使用索引: SELECT * FROM tbl_name WHER

B-Tree 索引和 Hash 索引的对照

对于 B-tree 和 hash 数据结构的理解可以有助于预測不同存储引擎下使用不同索引的查询性能的差异.尤其是那些同意你选择 B-tree 或者 hash 索引的内存存储引擎. B-Tree 索引的特点 B-tree 索引可以用于使用 =, >, >=, <, <= 或者 BETWEEN 运算符的列比較.假设 LIKE 的參数是一个没有以通配符起始的常量字符串的话也可以使用这样的索引. 比方.下面 SELECT 语句就使用索引: SELECT * FROM tbl_name WH

mysql中innodb和myisam对比及索引原理区别(转)

InnoDB和MyISAM是很多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,5.7之后就不一样了 1.事务和外键 InnoDB具有事务,支持4个事务隔离级别,回滚,崩溃修复能力和多版本并发的事务安全,包括ACID.如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能 MyISAM管理非事务表.它提供高速存储和检索,以及全文搜索能力.如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择 2.全文索引 I

【Todo】聚集索引、非聚集索引、聚集索引组织表、堆组织表、InnoDB、MyISAM等的学习

参考: http://www.jb51.net/article/76007.htm http://blog.csdn.net/xqy1522/article/details/6750252 下面是第一篇的总结: 在MySQL中,InnoDB引擎表是(聚集)索引组织表(clustered index organize table),而MyISAM引擎表则是堆组织表(heap organize table). 聚集索引是一种索引组织形式,索引的键值逻辑顺序决定了表数据行的物理存储顺序: 而非聚集索引

索引的分类--B-Tree索引和Hash索引

索引是存储引擎用来快速查找记录的一种数据结构,按照实现的方式有不同的种类,想B-Tree索引,hash索引,空间数据索引和全文索引等.下面主要说一下B-Tree索引和Hash索引.人们在谈论索引的时候如果没有特别说明,一般指的是B-Tree索引.B-Tree索引是使用B-Tree数据结构来存储索引的.B-Tree通常意味着所有的值是按照顺序存储的.B-Tree树有如下几个特征:⑴树中每个结点至多有m 棵子树:⑵若根结点不是叶子结点,则至少有两棵子树:⑶除根结点之外的所有非终端结点至少有[m/2]

Hash索引和BTree索引

索引是帮助mysql获取数据的数据结构. 最常见的索引是Btree索引和Hash索引. 不同的引擎对于索引有不同的支持:Innodb和MyISAM默认的索引是Btree索引:而Mermory默认的索引是Hash索引. Hash索引 所谓Hash索引,当我们要给某张表某列添加索引时,将这张表的这一列进行哈希算法计算,得到哈希值.排序在哈希数组上.所以Hash索引能够一次定位.其效率非常高,而Btree索引须要经过多次的磁盘IO.可是innodb和myisam之所以没有採用它,是由于它存在着好多缺点

mysql btree与hash索引的适用场景和限制

btree索引: 如果没有特别指明类型,多半说的就是btree索引,它使用btree数据结构来存储数据,大多数mysql引擎都支持这种索引,archive引擎是一个例外,5.1之前这个引擎不支持任何索引,5.1开始才支持单列自增的索引.innodb使用b+tree=btree(btree已经不使用了) 存储引擎以不同的方式使用btree索引,性能也各不相同,各有优劣,如:myisam使用前缀压缩技术使得索引更小(但也可能导致连接表查询性能降低),但innodb则按照原数据格式进行存储,再如:my