mysql支持的存储引擎与索引结构对照表如下:
Storage Engine | Permissible Index Types |
InnoDB | BTREE |
MyISAM | BTREE |
MEMORY|HEAP | HASH,BTREE |
NDB | HASH,BTREE |
从表中可以看出,默认InnoDB存储引擎的表,索引类型并不支持hash。
而MEMORY类型却可以支持hash。可以考虑创建一个表,存储引擎指定为memory。
建表:
create table emp_test(
id int,
name varchar(20),
age int,
salary decimal(8,2)
)engine=memory default charset=utf8;
建索引:
create index idx_id_hash using hash on emp_test(id);
查看索引:
show index from emp_test;
运行截图:
我们看到索引类型为HASH,表明索引创建成功。
hash索引的特点是,查询效率高,因为只需要一次就能定位到数据,但是如果是范围查找,索引就失效了。我们不妨来看看一个执行计划:
从执行计划可以看出,hash索引不支持范围查找,因为hash计算的结果可能与真实的结果顺序不一致。因此范围查找就失效了。