(ainusers原创)Hash索引和BTree索引

注:

Innodb和myisam默认的索引是Btree索引

Hash索引(类比于拼音查找汉字)   BTree(类比于偏旁查找汉字)

区别(了解Innodb和myisam主要还应该从区别开始)

1.主要区别在于:Hash不能用于范围查找

2.检索效率远高于BTree索引

3.联合索引(复合索引)中,Hash索引不能利用部分索引键查询

4.BTree支持的联合索引的最优前缀,Hash要么全部使用,要么不使用

5. Hash索引无法避免数据的排序操作 
由于Hash索引中存放的是经过Hash计算之后的Hash值,而且Hash值的大小关系并不一定和Hash运算前的键值完全一样,所以数据库无法利用索引的数据来避免任何排序运算。

6. Hash索引任何时候都不能避免表扫描 
Hash索引是将索引键通过Hash运算之后,将Hash运算结果的Hash值和所对应的行指针信息存放于一个Hash表中,由于不同索引键存在相同Hash值,所以即使满足某个Hash键值的数据的记录条数,也无法从Hash索引中直接完成查询,还是要通过访问表中的实际数据进行比较,并得到相应的结果。

7. Hash索引遇到大量Hash值相等的情况后性能并不一定会比BTree高 
对于选择性比较低的索引键,如果创建Hash索引,那么将会存在大量记录指针信息存于同一个Hash值相关联。这样要定位某一条记录时就会非常麻烦,会浪费多次表数据访问,而造成整体性能底下。

8.Hash索引每次都要全表扫描(解释查看第6条)

一、BTree索引

不仅可以被用在=,>,>=,<,<=和between这些比较操作符上,而且还可以用于like操作符(查询条件是一个不以通配符开头的常量)

select * from user where name like ‘%jack’;      //此sql不会使用索引

BTree索引是以B+树为存储结构实现的

MyISAM的索引方式也称为非聚集,Innodb的索引方式成为聚集索引

MyISAM中数据文件和索引文件是分开的,Innodb中数据文件和索引文件不是分开的

     MyISAM中Btree索引去搜索的时候,若key存在,在data域找到其地址,然后根据地址去表中查找数据记录。

     Innodb中叶子节点存储的并不是表的地址,而是数据

二、Hash索引

只能用于对等比较,例如=,<=>(相当于=)操作符

当要给某张表某列增加索引时,将这张表的这一列进行哈希算法计算,得到哈希值,排序在哈希数组上。所以Hash索引可以一次定位,其效率很高,而Btree索引需要经过B树进行节点查找多次的磁盘IO

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值