`

索引(BTree和hash区别)

 
阅读更多

在MySQL里常用的索引数据结构有B+树索引和哈希索引两种,我们来看下这两种索引数据结构的区别及其不同的应用建议。

二者区别

备注:先说下,在MySQL文档里,实际上是把B+树索引写成了BTREE,例如像下面这样的写法:

CREATE TABLE t(
aid int unsigned not null auto_increment,
userid int unsigned not null default 0,
username varchar(20) not null default ‘’,
detail varchar(255) not null default ‘’,
primary key(aid),
unique key(uid) USING BTREE,
key (username(12)) USING BTREE — 此处 uname 列只创建了最左12个字符长度的部分索引
)engine=InnoDB;

一个经典的B+树索引数据结构见下图:
20160106B树索引
(图片源自网络)

B+树是一个平衡的多叉树,从根节点到每个叶子节点的高度差值不超过1,而且同层级的节点间有指针相互链接。

在B+树上的常规检索,从根节点到叶子节点的搜索效率基本相当,不会出现大幅波动,而且基于索引的顺序扫描时,也可以利用双向指针快速左右移动,效率非常高。

因此,B+树索引被广泛应用于数据库、文件系统等场景。顺便说一下,xfs文件系统比ext3/ext4效率高很多的原因之一就是,它的文件及目录索引结构全部采用B+树索引,而ext3/ext4的文件目录结构则采用Linked list, hashed B-tree、Extents/Bitmap等索引数据结构,因此在高I/O压力下,其IOPS能力不如xfs。

详细可参见:

https://en.wikipedia.org/wiki/Ext4
https://en.wikipedia.org/wiki/XFS

哈希索引的示意图则是这样的:
20160106哈希索引
(图片源自网络)

简单地说,哈希索引就是采用一定的哈希算法,把键值换算成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可立刻定位到相应的位置,速度非常快。

从上面的图来看,B+树索引和哈希索引的明显区别是:

  • 如果是等值查询,那么哈希索引明显有绝对优势,因为只需要经过一次算法即可找到相应的键值;当然了,这个前提是,键值都是唯一的。如果键值不是唯一的,就需要先找到该键所在位置,然后再根据链表往后扫描,直到找到相应的数据;
  • 从示意图中也能看到,如果是范围查询检索,这时候哈希索引就毫无用武之地了,因为原先是有序的键值,经过哈希算法后,有可能变成不连续的了,就没办法再利用索引完成范围查询检索;
  • 同理,哈希索引也没办法利用索引完成排序,以及like ‘xxx%’ 这样的部分模糊查询(这种部分模糊查询,其实本质上也是范围查询);
  • 哈希索引也不支持多列联合索引的最左匹配规则
  • B+树索引的关键字检索效率比较平均,不像B树那样波动幅度大,在有大量重复键值情况下,哈希索引的效率也是极低的,因为存在所谓的哈希碰撞问题

后记

在MySQL中,只有HEAP/MEMORY引擎表才能显式支持哈希索引(NDB也支持,但这个不常用),InnoDB引擎的自适应哈希索引(adaptive hash index)不在此列,因为这不是创建索引时可指定的。

还需要注意到:HEAP/MEMORY引擎表在mysql实例重启后,数据会丢失。

通常,B+树索引结构适用于绝大多数场景,像下面这种场景用哈希索引才更有优势:

在HEAP表中,如果存储的数据重复度很低(也就是说基数很大),对该列数据以等值查询为主,没有范围查询、没有排序的时候,特别适合采用哈希索引

例如这种SQL:
SELECT … FROM t WHERE C1 = ?; — 仅等值查询

在大多数场景下,都会有范围查询、排序、分组等查询特征,用B+树索引就可以了。

分享到:
评论

相关推荐

    Mysql中的Btree与Hash索引比较

    MySQL中的Btree与Hash索引是两种常见的索引类型,每种都有其特定的适用场景和优缺点。这里我们将深入探讨这两种索引的特征以及它们在不同查询操作下的表现。 首先,Btree(B-Tree)索引是MySQL中最常用的索引结构,...

    索引类型FULLTEXT,HASH,BTREE,RTREE,索引优化1

    数据库索引是提升查询效率的关键工具,MySQL 中提供了多种类型的索引,包括 FULLTEXT、HASH、BTREE 和 RTREE。本文主要关注前三者,详细解析它们的原理、存储结构和优缺点。 首先,BTree 索引是最常见的索引类型,...

    MySQL Hash索引和B-Tree索引的区别

    MySQL中的索引是提高查询效率的关键工具,其中两种常见的索引类型是Hash索引和B-Tree索引。这两种索引各有特点,适用于不同的查询场景。 首先,Hash索引以其高效的查找性能脱颖而出。Hash索引的工作原理是通过索引...

    MySQL数据库索引优化

    MySQL数据库索引优化是数据库管理员和开发人员在提升数据库性能方面的一个关键点,涉及BTree索引和Hash索引以及索引优化的策略。索引是数据库中一种非常重要的数据结构,它能够大幅提升查询的效率,但也需要恰当的...

    Hash索引和B+树索引的区别

    文章目录前言B+树HashHash索引与B+树索引的区别总结 前言 我们都知道在MySQL中索引的数据结构有两种,一种是Hash,另一种是BTree。在数据表中建立什么样的索引需要我们根据实际情况进行选择。 B+树 B+树结构示意图:...

    MYSQL索引知识

    MySQL中的索引主要有两种存储类型:BTREE(B树)和HASH。 1. **什么是索引及建立索引的原因**: 索引是一种数据结构,它为数据库表中的列提供快速访问路径。当查询某个列中特定值的行时,MySQL不再需要从头到尾...

    072401MySQL索引2

    InnoDB的BTREE是聚簇索引,数据和索引是存储在一起的,提高了检索效率。每张表只有一个聚簇索引,其他辅助索引都指向它,因此非聚簇索引的效率相对较低。 2. **HASH索引**:仅在Memory存储引擎中支持。它基于哈希...

    MySQL 索引最佳实践

    - **哈希索引(HASH索引)**:在MEMORY和NDB存储引擎中使用。 - **位图索引(BITMAP索引)**:MySQL目前不支持这种索引类型。 - **全文索引(FULLTEXT索引)**:MyISAM和InnoDB(自MySQL 5.6版本起)支持全文索引。 ...

    mysql面试题,MySQL中有几种索引类型,可以简单说说吗?

    BTREE :BTREE索引就是一种将索引值按一定的算法,存入一个树形的数据结构中(二叉树),每次查询都是从树的入口root开始,依次遍历node,获取leaf。这是MySQL里默认和最常用的索引类型。 RTREE :RTREE在MySQL很少...

    MySQL 创建索引(Create Index)的方法和语法结构及例子

    CREATE INDEX Syntax CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name [index_type] ON ... HASH | RTREE} 代码如下: — 创建无索引的表格 create table testNoPK ( id int not null, name varchar(10) ); — 创建

    Mysql索引优化解决方案.doc

    索引的数据结构有多种,常用的有BTree索引(Myisam普通索引)、B+Tree索引(Innodb普通索引)、Hash索引(memory存储引擎)等等。索引的优点是可以提高数据检索的效率,降低数据库的IO成本。通过索引对数据进行排序...

    mysql 相关介绍以及优化

    MySQL 支持多种索引类型,包括 BTREE、HASH 等。 三、SQL 优化 * 优化 SQL 语句:优化 SQL 语句可以提高查询性能。可以使用 EXPLAIN 语句来优化 SQL 语句。 * 使用索引:索引可以提高查询性能。 MySQL 的索引...

    mysql索引介绍学习

    * 按索引方法划分:BTREE索引、HASH索引 * 按索引列数划分:单列索引、组合索引 * 按作用划分:覆盖索引、前缀索引等 MySQL的存储模型: * 连接管理:客户端跟数据库建立连接的过程,MySQL需要负责认证、管理连接...

    mysql索引笔记1

    1. BTREE索引:最常见的索引类型,适合范围查询和排序。 2. Hash索引:适用于等值查询,不支持范围查询和排序。 3. Full-Text索引:用于全文搜索。 4. R-Tree索引:适用于多维数据,如地理坐标。 创建、删除和查看...

    第9章MySQL索引.docx

    另外,还有其他类型的索引,如哈希(HASH)索引和B树(BTREE)索引。哈希索引基于哈希函数,能实现快速的一次性定位,但通常只适用于等值查询,而不支持范围查询。而B树索引则是一种平衡多路搜索树,它可以按特定...

    查看mySQL数据库索引

    - `index_type`: 索引的类型,如BTREE、HASH等。 - `comment`: 关于索引的注释。 - `index_comment`: 索引的用户定义注释。 #### 四、检查MySQL索引是否生效 为了确保索引能够正常工作并提高查询效率,我们需要...

    一套MySQL索引总结就够了

    - **Hash索引**:适用于精确匹配查询,如`=`操作符,但在某些情况下不支持范围查询。 - **FULLTEXT全文索引**:专门用于全文检索,适用于复杂的文本搜索。 2. **按应用层次划分**: - **普通索引**:最基本类型...

    MYSQL数据库创建索引目录的方法和代码.pdf

    - `index_type`:可选,索引类型,如BTREE(B树,最常用的索引类型)、HASH(哈希索引,适用于等值查询)或RTREE(R树,用于处理多维空间数据)。 以下是一些代码示例: 1. 创建无索引的表格: ```sql CREATE ...

Global site tag (gtag.js) - Google Analytics