MySQL中两种索引Hash与B-Tree的区别

  MySQL Hash索引和B-Tree索引的区别究竟在哪里呢?相信很多人都有这样的疑问,下文对两者的区别进行了详细的分析,供您参考。

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

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

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

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

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

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

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

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

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

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

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

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

时间: 2024-09-27 23:26:22

MySQL中两种索引Hash与B-Tree的区别的相关文章

MySQL中两种快速创建空表的方式的区别

在MySQL中有两种方法 1.create table t_name select ... 2.create table t_name like ... 第一种会取消掉原来表的有些定义,且引擎是系统默认引擎. 手册上是这么讲的:Some conversion of data types might occur. For example, the AUTO_INCREMENT attribute is not preserved, and VARchar columns can become ch

Mysql中的Btree与Hash索引比较_Mysql

mysql最常用的索引结构是btree(O(log(n))),但是总有一些情况下我们为了更好的性能希望能使用别的类型的索引.hash就是其中一种选择,例如我们在通过用户名检索用户id的时候,他们总是一对一的关系,用到的操作符只是=而已,假如使用hash作为索引数据结构的话,时间复杂度可以降到O(1).不幸的是,目前的mysql版本(5.6)中,hash只支持MEMORY和NDB两种引擎,而我们最常用的INNODB和MYISAM都不支持hash类型的索引. 不管怎样,还是要了解一下这两种索引的区别

php连接MySQL的两种方式对比_Mysql

记录一下PHP连接MySQL的两种方式. 先mock一下数据,可以执行一下sql. /*创建数据库*/ CREATE DATABASE IF NOT EXISTS `test`; /*选择数据库*/ USE `test`; /*创建表*/ CREATE TABLE IF NOT EXISTS `user` ( name varchar(50), age int ); /*插入测试数据*/ INSERT INTO `user` (name, age) VALUES('harry', 20), ('

python-关于mysql中的位图索引和位片索引问题

问题描述 关于mysql中的位图索引和位片索引问题 老师给了一个作业要求利用其他语言例如Python或者C++来实现位图索引,但是一直教的就是mysql,没要办法建位图索引啊.不知道怎么办才好了,求大神指导... 解决方案 Mysql 索引 解决方案二: http://www.cnblogs.com/yuerdongni/p/4255395.html

jsp页面中两种方法显示当前时间的简单实例_JSP编程

在jsp页面实现显示当前的日期时间,我们可以用一下两种方式实现: 1. 通过在jsp页面添加Java代码实现,主要代码如下所示 java.text.SimpleDateFormat simpleDateFormat = new java.text.SimpleDateFormat( "yyyy-MM-dd HH:mm:ss"); java.util.Date currentTime = new java.util.Date(); String time = simpleDateForm

MySQL中的唯一索引的简单学习教程_Mysql

mysql 唯一索引UNIQUE一般用于不重复数据字段了我们经常会在数据表中的id设置为唯一索引UNIQUE,下面我来介绍如何在mysql中使用唯一索引UNIQUE吧. 创建唯一索引的目的不是为了提高访问速度,而只是为了避免数据出现重复.唯一索引可以有多个但索引列的值必须唯一,索引列的值允许有空值.如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该使用关键字UNIQUE. 把它定义为一个唯一索引. 创建表时直接设置: DROP TABLE IF EXISTS `st

link以下两种写法结果一样,有什么区别?

问题描述 link以下两种写法结果一样,有什么区别? 写法1: scores.GroupBy(x=>x.StuID).OrderBy(x =>x.Sum()).ThenBy(x => x.Key) 写法2: scores.GroupBy(x=>x.StuID).OrderBy(x =>x.Key).OrderBy(x=>x.Sum()) 解决方案 写法2不推荐,理论上这个结果和写法1一样,但是基于这样一个假设,那就是OrderBy执行的是稳定的排序. 所谓稳定的排序,就

c++下面两种构造函数的实现方式有什么区别?为什么?( 请说详细点 谢谢)

问题描述 c++下面两种构造函数的实现方式有什么区别?为什么?( 请说详细点 谢谢) c++下面两种构造函数的实现方式有什么区别?为什么?( 请说详细点 谢谢) 一:Savingaccount::Savingaccount(int date,int id,double rate):id(id),balance(0),rate(rate),lastdate(date),accumulation(0) { //构造函数的第一种实现方式 cout<<date<<"t#"

MySQL中两表UNION查询实例介绍

一,union查询用法 union查询比较简单,就好像把两张表合并了,字段也合成一块 假如是 select * from table1, table2 的话,两个的相同的字段不会合并但 select a1 from table1 union select a1 from table2 这样的话就可以把两个表的a1合成一个 上面不知道你看明白了,没有我们接着看实例 一使用SELECT子句进行多表查询 SELECT 字段名 FROM 表1,表2 - WHERE 表1.字段 = 表2.字段 AND 其