数据库(11)-- Hash索引和BTree索引 的区别

索引是帮助mysql获取数据的数据结构。最常见的索引是Btree索引和Hash索引。

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

 

Hash索引

哈希索引包含以数组形式组织的 Bucket 集合。 哈希函数将索引键映射到哈希索引中对应的 Bucket。 下图展示映射到哈希索引中三个不同 Bucket 的三个索引键。 出于演示目的,哈希函数的名称为 f(x)。

映射到不同 Bucket 的索引键。

用于哈希索引的哈希函数具有以下特征:

  • SQL Server 拥有一个用于所有哈希索引的哈希函数。

  • 哈希函数具有确定性。 同一索引键始终映射到哈希索引中的同一 Bucket。

  • 多个索引键可能映射到同一个哈希 Bucket。

  • 哈希函数经过均衡处理,这意味着索引键值在哈希桶上的分布通常符合泊松分布。

    泊松分布并非均匀分布。 索引键值并非均匀地分布在哈希 Bucket中。 例如,泊松分布的 n 非重复索引键通过 n 哈希桶中约三分之一空存储桶,包含一个索引键,则存储桶的三分之一的结果和其他第三个包含两个索引键。 少量 Bucket 将包含两个以上的键。

如果两个索引键映射到同一个哈希 Bucket,则产生哈希冲突。 大量哈希冲突可影响读取操作的性能。

内存哈希索引结构包含一个内存指针数组。 每个 Bucket 映射到该数组中的一个偏移位置。 数组中的每个 Bucket 指向该哈希 Bucket 中的第一行。 Bucket 中的每行指向下行,因而形成了每个哈希 Bucket 的行链,如下图所示。

内存中哈希索引结构。

该图有三个包含行的 Bucket。 顶部的第二个 Bucket 包含三个红色行。 第四个 Bucket 包含一个蓝色行。 底部的 Bucket 包含两个绿色行。 这些可能是同一行的不同版本。

 

所谓Hash索引,当我们要给某张表某列增加索引时,将这张表的这一列进行哈希算法计算,得到哈希值,排序在哈希数组上。所以Hash索引可以一次定位,其效率很高,而Btree索引需要经过多次的磁盘IO,但是innodb和myisam之所以没有采用它,是因为它存在着好多缺点:

1、因为Hash索引比较的是经过Hash计算的值,所以只能进行等式比较,不能用于范围查询

1、每次都要全表扫描

2、由于哈希值是按照顺序排列的,但是哈希值映射的真正数据在哈希表中就不一定按照顺序排列,所以无法利用Hash索引来加速任何排序操作

3、不能用部分索引键来搜索,因为组合索引在计算哈希值的时候是一起计算的。

4、当哈希值大量重复且数据量非常大时,其检索效率并没有Btree索引高的。

 

Btree索引

至于Btree索引,它是以B+树为存储结构实现的。

但是Btree索引的存储结构在Innodb和MyISAM中有很大区别。

在MyISAM中,我们如果要对某张表的某列建立Btree索引的话,如图:

 

所以我们经常会说MyISAM中数据文件和索引文件是分开的。

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

至于辅助索引,类似于主索引,唯一区别就是主索引上的值不能重复,而辅助索引可以重复。


 

 

 

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

至于Innodb它跟上面又有很大不同,它的叶子节点存储的并不是表的地址,而是数据


 

 

 

 

我们可以看到这里并没有将地址放入叶子节点,而是直接放入了对应的数据,这也就是我们平常说到的,Innodb的索引文件就是数据文件,

 

那么对于Innodb的辅助索引结构跟主索引也相差很多,如图:


 

 

 

我们可以发现,这里叶子节点存储的是主键的信息,所以我们在利用辅助索引的时候,检索到主键信息,然后再通过主键去主索引中定位表中的数据,这就可以说明Innodb中主键之所以不宜用过长的字段,由于所有的辅助索引都包含主索引,所以很容易让辅助索引变得庞大。

我们还可以发现:在Innodb中尽量使用自增的主键,这样每次增加数据时只需要在后面添加即可,非单调的主键在插入时会需要维持B+tree特性而进行分裂调整,十分低效。

 

 

Btree索引中的最左匹配原则:

Btree是按照从左到右的顺序来建立搜索树的。比如索引是(name,age,sex),会先检查name字段,如果name字段相同再去检查后两个字段。

所以当传进来的是后两个字段的数据(age,sex),因为建立搜索树的时候是按照第一个字段建立的,所以必须根据name字段才能知道下一个字段去哪里查询。

所以传进来的是(name,sex)时,首先会根据name指定搜索方向,但是第二个字段缺失,所以将name字段正确的都找到后,然后才会去匹配sex的数据。

 

建立索引的规则:

1、利用最左前缀:Mysql会一直向右查找直到遇到范围操作(>,<,like、between)就停止匹配。比如a=1 and b=2 and c>3 and d=6;此时如果建立了(a,b,c,d)索引,那么后面的d索引是完全没有用到,当换成了(a,b,d,c)就可以用到。

2、不能过度索引:在修改表内容的时候,索引必须更新或者重构,所以索引过多时,会消耗更多的时间。

3、尽量扩展索引而不要新建索引

4、最适合的索引的列是出现在where子句中的列或连接子句中指定的列。

5、不同值较少的列不必要建立索引(性别)。

 

 

转载自:http://blog.csdn.net/u014307117/article/details/47325091

转载于:https://www.cnblogs.com/hedeyong/p/8044519.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/368448.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JBoss AS 8中的Java EE 7和EJB 3.2支持

你们中有些人可能已经知道Java EE 7规范的Public Final Draft版本已经发布 。 除此以外&#xff0c;此版本的Java EE还引入了EJB规范的EJB 3.2版本。 与EJB 3.1规范相比&#xff0c;EJB 3.2具有一些新功能。 我在这里引用EJB 3.2规范中的文本&#xff0c;总结了新功能&#xff…

MySQL的复制:MySQL系列之十三

一、MySQL复制相关概念 主从复制&#xff1a;主节点将数据同步到多个从节点级联复制&#xff1a;主节点将数据同步到一个从节点&#xff0c;其他的从节点在向从节点复制数据同步复制&#xff1a;将数据从主节点全部同步到从节点时才返回给用户的复制策略叫同步复制异步复制&…

mysql与jframe_java-如何在JFrame上显示从mysql检索到的图像

我在显示从JFrame的数据库检索的图像时遇到问题.这是我将要使用的??????……try{Class.forName("com.mysql.jdbc.Driver");Connection conDriverManager.getConnection("jdbc:mysql://localhost:3306/studio","root","");Statem…

bootstrap到底是用来做什么的(概念)

Bootstrap官网&#xff1a;http://v3.bootcss.com/ Bootstrap是Twitter推出的一个用于前端开发的开源工具包。它由Twitter的设计师Mark Otto和Jacob Thornton合作开发,是一个CSS/HTML框架。 是一个做网页的框架&#xff08;目前最流行的WEB前端框架&#xff09;&#xff0c;就…

hdu 1020 Encoding

题目 这个题有一个挺坑的误区&#xff0c;不是统计字符串中出现的所有字符的个数&#xff0c;而是统计相邻的个数 刚开始就写错了 正解&#xff1a; #include <stdio.h> #include <string.h> int main(){int n,i,num;char str[10001];scanf("%d",&n)…

将NetBeans代码模板弯曲到我的意愿

任何阅读过我关于NetBeans的文章的人都知道&#xff0c;我真的很喜欢NetBeans的众多功能。 但是&#xff0c;最近&#xff0c;我发现自己对NetBeans特定功能的特定问题越来越恼火。 最终&#xff0c;它使我烦恼不已&#xff0c;促使我开始研究如何根据自己的喜好禁用或更改该功…

MySQL安装过程

最近试着重装了下MySQL&#xff0c;安装过程很简单&#xff0c;希望能帮助大家 mysql安装过程 1. 下载&#xff1a; 我下载的是64位系统的zip包&#xff1a; 下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/ 下载zip的包。 下载后解压到对应目录 如&#xff1a;D:…

极简的MyBatis在Spring Boot下的配置

以我的一个项目为例。 0、项目结构&#xff1a; 1、POM中添加MyBatis的依赖&#xff1a; <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.1</version> …

mysql sum很慢,可以在MySQL中加快sum()吗?

Im doing a "select sum(foo) from bar" query on a MySQL database thats summing up 7.3mm records and taking about 22 seconds per run. Is there a trick to speeding up sums in MySQL?解决方案No, you cant speed up the function itself. The problem here…

css常用属性总结:颜色和单位

在css代码编写中&#xff0c;估计颜色和单位是必不可少的&#xff0c;然而在css中关于颜色和单位值的写法有很多种写法&#xff0c;所以有必要把它弄清楚。 颜色 当初我在初学前端的时候&#xff0c;就会冒出一个疑问“我该如何设置网页颜色&#xff1f;”&#xff0c;一般常…

JPA –我应该成为懒惰的极端主义者吗?

当您与开发人员讨论将对象映射到关系数据库时&#xff0c;他们经常抱怨JPA性能差&#xff0c;JPA提供程序的行为不可预测等。通常&#xff0c;在对话的某些时候&#xff0c;您会听到&#xff1a; “让我们完全放弃这项技术&#xff0c;我们在上个月的会议上看到了更好的东西。 …

mysql恢复 报错_Mysql 数据恢复报错

1.测试mysql binlog 数据恢复功能&#xff0c;我的mysql版本是5.7.172.删了数据之后&#xff0c;执行show binlog events 命令得到如下记录3.找到开始删除和结束删除的位置&#xff0c;然后执行恢复命令:mysqlbinlog --no-defaults --start-position8991 --stop-position290468…

IONIC

1.项目摘要  随着移动互联网的不断发展&#xff0c;移动端流量所占比例已经越来越高。下图来自IResearch所做的关于移动互联网的市场调研报告 由此我们可以看出&#xff0c;移动互联网在人们生活中的位置越来越重要。 受益于国家“提速降费”以及即将取消流量漫游的优惠政策&…

line-height与图片底部间隙的学习整理转述

前言&#xff1a;这是笔者学习之后自己的理解与整理。如果有错误或者疑问的地方&#xff0c;请大家指正&#xff0c;我会持续更新&#xff01; 看大牛张鑫旭的视屏可能会理解的更深一些&#xff0c;点击这里&#xff1b; line-height&#xff0c;两行文字的基线之间的距离&…

java学习之异常之格式

第一个格式&#xff1a; try{}catch(){} 第二个格式&#xff1a; try{}catch(){}finally{} 第三个格式&#xff1a; try{}finally{} 注意&#xff1a;catch是用于处理异常&#xff0c;如果没有catch就代表异常没有被处理过&#xff0c;如果该异常是检测时异常&#xff0c;那么必…

分数DRL:在OptaPlanner中更快,更轻松

对于OptaPlanner &#xff08; Drools Planner&#xff09;6.0.0.Beta1&#xff0c;我已经用更优雅的ConstraintMatch系统替换了ConstraintOccurrence。 结果是您的DRL评分文件为&#xff1a; 快多了 更容易读写 错误的发生率要低得多&#xff0c;因为它们使分数损坏变得更加…

mysql 的数据库实例理解_理解数据库和实例

数据库&#xff1a;物理操作系统文件或者其他形式文件类型的集合。在mysql中&#xff0c;数据库文件可以是frm、MYD、MYI、ibd等结尾的文件。当使用NDB引擎时&#xff0c;数据库的文件可能不是操作系统文件&#xff0c;而是存放于内存之中的文件。实例&#xff1a;mysql数据库由…

STM32 环境搭建

从之前的51&#xff0c;到后来的AVR&#xff0c;再到现在的STM32&#xff0c;处理器的处理能力在不断的提高&#xff0c;我们也跟随着处理器一步一步的玩到了STM32 目前STM32的开发环境很多&#xff0c;常用的例如Keil&#xff0c;IAR等&#xff0c;但是这些软件都是收费的&…

css常用属性初总结:伪元素和伪元素

前面几遍中我们分别说到了id选择器和class选择器&#xff0c;以及它们的区别和联系&#xff0c;下面大家一起来探究一下神奇的为类和伪元素吧。 其实以前我对伪类和伪元素也是搞得稀里糊涂的&#xff0c;现在决定剥开它神秘的外衣&#xff0c;首先&#xff0c;究竟什么是伪类&…

Java 8:CompletableFuture的权威指南

Java 8即将到来&#xff0c;因此该学习新功能了。 尽管Java 7和Java 6只是次要的发行版&#xff0c;但版本8将向前迈出一大步。 也许太大了&#xff1f; 今天&#xff0c;我将为您详细介绍JDK 8中的新抽象– CompletableFuture<T> 。 众所周知&#xff0c;Java 8有望在不…