Hash索引和BTree索引区别

Hash仅适用于对等比较(=、>、<、>=、<=、between),而BTree可以支持like模糊查询。

不同的引擎支持不同的索引:Innodb和MyISAM默认的索引是BTree索引;而Mermory默认的索引是Hash索引。

1. BTree

BTree索引是最常用的mysql数据库索引算法,因为它不仅可以被用在=、>、<、>=、<=、between这些比较操作符上,还可以用于like操作符。
只要它的查询条件是一个不以通配符开头的常量则该索引生效;否则索引失效。

. Hash

Hah索引只能用于对等比较,例如=、>、<、>=、<=、between。由于是一次定位数据,不像BTree索引需要从根节点到枝节点,最后才能访问到叶节点这样多次IO访问,所以检索效率远高于BTree索引。

但是为什么使用BTree比Hash多呢?

  1. Hash索引仅仅能满足=、>、<、>=、<=、between查询,不能使用范围查询。

  2. 联合索引中,Hash索引不能利用部分索引键查询。
    对于联合索引中的多个列,Hash要么全部使用,要么全部不适用,并不支持BTree支持的联合索引的最有前缀,也就是联合索引的前面一个或几个索引键进行查询时,Hash索引无法被利用。

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

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

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

  6. Hash索引查找数据基本上能一次定位数据,当然有大量碰撞的话性能也会下降。而BTree索引就得在节点上挨个查找了,很明显在数据精确查找方面Hash索引的效率要高于BTree索引的;

  7. 因为Hash算法是基于等值计算的,所以对于like等范围查找Hash索引不支持;

  8. 对于BTree支持的联合索引的最有前缀,hash也是无法支持的,联合索引中的字段要么全用要么全不用。

  9. hash不支持索引排序,索引值和计算出来的hash值大小并不一定一致。

Hash索引和BTree索引区别相关推荐

  1. Hash索引和BTree索引

    索引是帮助mysql获取数据的数据结构.最常见的索引是Btree索引和Hash索引. 不同的引擎对于索引有不同的支持:Innodb和MyISAM默认的索引是Btree索引:而Mermory默认的索引是 ...

  2. mysql索引btree hash_Hash索引和BTree索引

    索引是帮助mysql获取数据的数据结构.最常见的索引是Btree索引和Hash索引. 不同的引擎对于索引有不同的支持:Innodb和MyISAM默认的索引是Btree索引:而Mermory默认的索引是 ...

  3. Bitmap 索引 vs. B-tree 索引:如何选择以及何时使用?——2-5

    --理解适当使用每个索引对性能的影响 Bitmap 索引 vs. B-tree 索引:如何选择以及何时使用?--1-5 Bitmap 索引 vs. B-tree 索引:如何选择以及何时使用?--2-5 ...

  4. Bitmap 索引 vs. B-tree 索引:如何选择以及何时使用?——4-5

    --理解适当使用每个索引对性能的影响 Bitmap 索引 vs. B-tree 索引:如何选择以及何时使用?--1-5 Bitmap 索引 vs. B-tree 索引:如何选择以及何时使用?--2-5 ...

  5. Mysql Hash索引和B-Tree索引区别(Comparison of B-Tree and Hash Indexes)

    上篇文章中说道,Mysql中的Btree索引和Hash索引的区别,没做展开描述,今天有空,上Mysql官方文档找到了相关答案,看完之后,针对两者的区别做如下总结: 引用维基百科上的描述,来解释一下这两 ...

  6. mysql 的hash和b tree_mysql索引hash索引和b-tree索引的区别

    Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-T ...

  7. MySQL索引类型 btree索引和hash索引的区别

    来源一 Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 ...

  8. PostgreSql索引(B-tree索引 Hash索引 GiST索引 SP-GiST索引 GIN 索引 BRIN 索引)

    索引 语法: CREATE INDEX test1_id_index ON test1 (id); 索引的名字test1_id_index可以自由选择,但我们最好选择一个能让我们想起该索引用途的名字. ...

  9. mysql btree检索策略_MySQL之Btree索引和HASH索引的区别以及索引优化策略

    索引是帮助mysql获取数据的数据结构.最常见的索引是Btree索引和Hash索引. 不同的引擎对于索引有不同的支持:Innodb和MyISAM默认的索引是Btree索引:而Mermory默认的索引是 ...

最新文章

  1. python学习笔记:(三)list(列表)常用的内置方法
  2. C#完美任意设置webBrowser框架默认的IE内核版本
  3. 文献记录(part91)--A boundary method for outlier detection based on support vector domain description
  4. DCX读书报告Bring structure to the web有感
  5. 话说Python:非主流编程语言
  6. xbox one s驱动_理想照进现实 理想ONE开始接受预定
  7. @程序员,我最多再等你两天!
  8. 高级终端termux下载不了Python_在安卓手机上安装Python写的软件是什么体验?
  9. PlaySound使用进阶
  10. 图片上打印汉字(C++、OPENCV+字库)
  11. 干货丨让你更容易影响别人的 52 个小技巧
  12. 深入探访支付宝双11十年路,技术凿穿焦虑与想象极限 | CYZONE特写...
  13. java 扫描tcp端口号_Java 端口扫描器 TCP的实现方法
  14. java裁剪图片_Java实现图片的裁剪
  15. windows下安装php环境(wampserver)
  16. python广告点击率预测_推荐系统中的点击率预估 – Advertising Recommendation
  17. Apk脱壳圣战之---如何脱掉“梆梆加固”的保护壳
  18. html插入flash时钟,教你利用Flash制作一个会走动的时钟(时针,分针,秒针)
  19. 实验记录 | BWA的安装
  20. C语言鼠标操作方法及源码

热门文章

  1. Java中比较常见的主流框架及相关技术合集
  2. 2018年带三维团队的一点总结
  3. 阿里云服务器能做小程序吗
  4. UVC(USB Video Class)协议讲解
  5. 如何使用JavaScript检查数字是否为素数?
  6. linux--Xshell的使用
  7. IDT发布ZEN 或 TAO 双淬灭探针
  8. 关于Switch的参数
  9. Javascript中append和appendChild有什么不同?
  10. 一文看尽SOTA生成式模型:9大类别21个模型全回顾!