2019独角兽企业重金招聘Python工程师标准>>>

在MySQL中,大多数索引(如 PRIMARY KEY,UNIQUE,INDEX和FULLTEXT)都是在BTREE中存储,但使用memory引擎可以选择BTREE索引或者HASH索引,两种不同类型的索引各自有其不同的使用范围。

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

可能很多人又有疑问了,既然 Hash 索引的效率要比 B-Tree 高很多,为什么大家不都用 Hash 索引而还要使用 B-Tree 索引呢?任何事物都是有两面性的,Hash 索引也一样,虽然 Hash 索引效率高,但是 Hash 索引本身由于其特殊性也带来了很多限制和弊端,主要有以下这些。

(1)Hash 索引仅仅能满足”=”,”IN”和”<=>”查询,不能使用范围查询。

由于 Hash 索引比较的是进行 Hash 运算之后的 Hash 值,所以它只能用于等值的过滤,不能用于基于范围的过滤,因为经过相应的 Hash 算法处理之后的 Hash 值的大小关系,并不能保证和Hash运算前完全一样。

(2)Hash 索引无法被用来避免数据的排序操作。

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

(3)Hash 索引不能利用部分索引键查询。

对于组合索引,Hash 索引在计算 Hash 值的时候是组合索引键合并后再一起计算 Hash 值,而不是单独计算 Hash 值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash 索引也无法被利用。

(4)Hash 索引在任何时候都不能避免表扫描。

前面已经知道,Hash 索引是将索引键通过 Hash 运算之后,将 Hash运算结果的 Hash 值和所对应的行指针信息存放于一个 Hash 表中,由于不同索引键存在相同 Hash 值,所以即使取满足某个 Hash 键值的数据的记录条数,也无法从 Hash 索引中直接完成查询,还是要通过访问表中的实际数据进行相应的比较,并得到相应的结果。

(5)Hash 索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高。

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

转载于:https://my.oschina.net/henrydong/blog/161861

MySQL索引的Index method中btree和hash的区别相关推荐

  1. MySQL索引的Index method中btree和hash的优缺点

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

  2. mysql rtree_优化体系--MySQL 索引优化(full-text、btree、hash、rtree)

    概述 目前大部分数据库系统及文件系统都采用B-Tree(B树)或其变种B Tree(B 树)作为索引结构.B Tree是数据库系统实现索引的首选数据结构.在MySQL中,索引属于存储引擎级别的概念,不 ...

  3. MySQL - 索引下推 Index Condition Pushdown 初探

    文章目录 生猛干货 Pre ICP 索引下推的含义 范围查找为啥不行? 搞定MySQL 生猛干货 带你搞定MySQL实战,轻松对应海量业务处理及高并发需求,从容应对大场面试 Pre MySQL - 索 ...

  4. mysql索引排序算法_MySQL中利用索引对数据进行排序的基础教程

    MySQL中,有两种方式生成有序结果集:一是使用filesort,二是按索引顺序扫描.利用索引进行排序操作是非常快的,而且可以利用同一索引同时进行查找和排序操作.当索引的顺序与ORDER BY中的列顺 ...

  5. MySQL索引与Index Condition Pushdown(二)

    实验 先从一个简单的实验开始直观认识ICP的作用. 安装数据库 首先需要安装一个支持ICP的MariaDB或MySQL数据库.我使用的是MariaDB 5.5.34,如果是使用MySQL则需要5.6版 ...

  6. mysql索引ab和ba_Mysql中的索引

    索引的常见模型有哈希表.有序数组和搜索树. 哈希表:一种以 KV 存储数据的结构,只适合等值查询,不适合范围查询. 有序数组:只适用于静态存储引擎,涉及到插入的时候比较麻烦.可以参考 Java 中的 ...

  7. MySQL索引(INDEX)是什么?

    导游 索引 索引设计原则 使用流程 为什么要建立索引? 索引优缺 索引类型 创建索引语法 普通索引 唯一索引 主键索引 复合索引 索引 在关系数据库中,索引是对数据库表中指定字段的一种存储结构.索引也 ...

  8. mysql id in set_mysql数据库中find_in_set()和in()用法区别

    mysql数据库中find_in_set()和in()用法区别 (2015-07-19 08:30:21) 标签: mysql数据库 find_in_set 在mysql中in可以包括指定的数字,而f ...

  9. mysql索引添加缓慢_mysql 中 创建索引很慢,怎么解决

    引用 如题,我现在 有一张表...里面的数据大概就是 800w 条左右,当然以后也可能会更多,这个表会频繁的更新! 我现在的处理是:每次更新 都会先truncate 这张表(因为里面的数据 已经不需要 ...

最新文章

  1. Vue之axios发送Ajax请求
  2. mac 安装mqtt
  3. 独家 | 一文读懂数据质量和验证检查(附代码)
  4. 软件项目管理0703:净收确认
  5. 第四次作业 孙保平034 李路平029
  6. mysql5.7 设置远程访问
  7. clock函数的时间单位_PAT B1026:程序运行时间
  8. 品质主管每日工作需要做哪些_游戏配音需要做哪些工作?
  9. VB .NET-文本文件读写
  10. uc看视频显示服务器有点忙,UC3软件常见问题处理方案
  11. Krypital Group(金氪资本)宣布完成对Ambrus Studio的战略投资
  12. win10电脑部分软件不能连接网络,只有QQ和微信可以连接网络,浏览器不能上网
  13. 大漠Android模拟器中控,最新如意大漠多线程中控模板,适用于手游模拟器脚本...
  14. 打车APP为何贴钱做生意?
  15. 为什么高级Android程序员永远不必担心自己的技术过时?
  16. FinFET基础知识合集
  17. 大数据分析案例-基于随机森林算法构建人口普查分析模型
  18. iis上ftp服务器用户设置,利用iis的ftp服务器建立ftp用户
  19. 【C语言】printf函数参数压栈问题
  20. 【QQ音乐Api】移花接木 打造自己的音乐电台

热门文章

  1. 5s的app显示无法连接服务器,苹果iphone5s手机无法连接App Store问题解决方法汇总...
  2. 如何在mysql中添加复选框_如何使用输入和复选框更新mysql
  3. java jni框架,Java JNI 简明教程(一)——传智播客JNI笔记(王泽佑)
  4. window连接树莓派linux桌面,远程连接Raspberry Pi(树莓派)图形用户界面(X Window)
  5. lbp matlab程序,求教大神给解释一下LBP特征提取每部分程序是干什么的
  6. 并查集(Disjiont Set)
  7. win7个人计算机的ip地址,win7计算机ip地址查询_win7本机ip地址查询
  8. 计算机缺少fixos.dll,fix_toolbox.dll
  9. html5+shim脚本,HTML5探秘:用requestAnimationFrame优化Web动画
  10. new_picview_一款漂亮的图片查看器PictureViewer