二者区别
在MySQL文档中,实际上是把B+树索引写成BTREE
CREATE TABLE t(
aid int unsigned not null auto_increment,
userid int unsigned not null default 0,
username varchar(20) not null default ‘’,
detail varchar(255) not null default ‘’,
primary key(aid),
unique key(uid) USING BTREE,
key (username(12)) USING BTREE — 此处 uname 列只创建了最左12个字符长度的部分索引
)engine=InnoDB;
B+树索引结构
B+树是一个平衡的多叉树,从根节点到每个叶子结点的高度差不超过1,而且同层级的节点间有指针相互链接
B+树的常规检索,从根节点到叶子节点的搜索速率基本相当,不会出现大幅波动,而且基于索引的顺序扫描,也可以利用双指针快速左右移动,效率非常高
Hash索引结构
哈希索引就是采用一定的hash算法将键值换算成新的哈希值
B+树和Hash索引的明显区别
-
如果是等值查询,那么hash索引具有绝对优势,
-
范围查询检索,就需要用到B+树
-
Hash索引没办法利用索引完成排序
-
Hash索引不支持多列联合索引的最左匹配原则
-
在有大量重复键值情况下,哈希索引的效率也是极低的,因为存在所谓的哈希碰撞问题。
在HEAP表中,如果存储的数据重复度很低(也就是说基数很大),对该列数据以等值查询为主,没有范围查询、没有排序的时候,特别适合采用哈希索引
例如这种SQL:
SELECT … FROM t WHERE C1 = ?; — 仅等值查询
在MySQL中,只有HEAP/MEMORY引擎表才能显式支持哈希索引(NDB也支持,但这个不常用),InnoDB引擎的自适应哈希索引(adaptive hash index)不在此列,因为这不是创建索引时可指定的。
还需要注意到:HEAP/MEMORY引擎表在mysql实例重启后,数据会丢失。
通常,B+树索引结构适用于绝大多数场景,像下面这种场景用哈希索引才更有优势: