关闭

B-Tree 索引和 Hash 索引的对比

标签: MySQLBTREEHashB-Tree索引
10897人阅读 评论(1) 收藏 举报
分类:

对于 B-tree 和 hash 数据结构的理解能够有助于预测不同存储引擎下使用不同索引的查询性能的差异,尤其是那些允许你选择 B-tree 或者 hash 索引的内存存储引擎。


B-Tree 索引的特点

B-tree 索引可以用于使用 =, >, >=, <, <= 或者 BETWEEN 运算符的列比较。如果 LIKE 的参数是一个没有以通配符起始的常量字符串的话也可以使用这种索引。比如,以下 SELECT 语句就使用索引:
SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%';
SELECT * FROM tbl_name WHERE key_col LIKE 'Pat%_ck%';

在第一个句子中,只会考虑 'Patrick' <= key_col < 'Patricl' 的记录。第二句中,则只会考虑 'Pat' <= key_col < 'Pau' 的记录。
以下 SELECT 语句不使用索引:
SELECT * FROM tbl_name WHERE key_col LIKE '%Patrick%';
SELECT * FROM tbl_name WHERE key_col LIKE other_col;

第一句里面,LIKE 的值起始于一个通配符。在第二句里,LIKE 的值不是一个常量。
如果你这样使用: ... LIKE '%string%',其中的 string 不大于三个字符,MySql 将使用 Turbo Boyer-Moore 算法来对该字符串表达式进行初始化,并使用这种表达式来让查询更加迅速。
如果 col_name 列创建了索引,那么一个使用了 col_name IS NULL 的查询是可以使用该索引的。
任何没有涵盖 WHERE 从句中所有 AND 级别的条件的索引将不会被使用。换句话讲,要想使用索引,该索引的前导列必须在每一个 AND 组合中使用到。
以下 WHERE 从句使用索引:
... WHERE index_part1=1 AND index_part2=2 AND other_column=3


    /* index = 1 OR index = 2 */
... WHERE index=1 OR A=10 AND index=2


    /* optimized like "index_part1='hello'" */
... WHERE index_part1='hello' AND index_part3=5


    /* Can use index on index1 but not on index2 or index3 */
... WHERE index1=1 AND index2=2 OR index1=3 AND index3=3;

这些 WHERE 从句不使用索引:
    /* index_part1 is not used */
... WHERE index_part2=1 AND index_part3=2


    /*  Index is not used in both parts of the WHERE clause  */
... WHERE index=1 OR A=10


    /* No index spans all rows  */
... WHERE index_part1=1 OR index_part2=10

有时,即使有索引可以使用,MySql 也不使用任何索引。发生这种情况的场景之一就是优化器估算出使用该索引将要求 MySql 去访问这张表的绝大部分记录。这种情况下,一个表扫描可能更快,因为它要求更少量的查询。但是,如果这样的一个查询使用了 LIMIT 来检索只是少量的记录时,MySql 还是会使用索引,因为它能够更快地找到这点记录并将其返回。


Hash 索引的特点

Hash 索引有着与刚才所讨论特点的相比截然不同的特点:
  • Hash 索引只能够用于使用 = 或者 <=> 运算符的相等比较(但是速度更快)。Hash 索引不能够用于诸如 < 等用于查找一个范围值的比较运算符。依赖于这种单值查找的系统被称为 "键-值存储";对于这种系统,尽可能地使用 hash 索引。
  • 优化器不能够使用 hash 索引来加速 ORDER BY 操作。这种类型的索引不能够用于按照顺序查找下一个条目。
  • MySql 无法使用 hash 索引估计两个值之间有多少行(这种情况由范围优化器来决定使用哪个索引)。如果你将一张 MyISAM 或 InnoDB 表转换成一个 hash 索引的内存表时,一些查询可能会受此影响。
  • 查找某行记录必须进行全键匹配。而 B-tree 索引,任何该键的左前缀都可用以查找记录。
原文链接:http://dev.mysql.com/doc/refman/5.5/en/index-btree-hash.html
1
0
查看评论

Hash索引和BTree索引

索引是帮助mysql获取数据的数据结构。最常见的索引是Btree索引和Hash索引。 不同的引擎对于索引有不同的支持:Innodb和MyISAM默认的索引是Btree索引;而Mermory默认的索引是Hash索引。 Hash索引 所谓Hash索引,当我们要给某张表某列增...
  • u014307117
  • u014307117
  • 2015-08-06 23:20
  • 13344

数据库索引系列四:索引算法Hash与BTree的区别

我们在mysql中常用两种索引算法BTree和Hash,两种算法检索方式不一样,对查询的作用也不一样。 一、BTree BTree索引是最常用的mysql数据库索引算法,因为它不仅可以被用在=,>,>=,<,<=和between这些比较操作符上,而且还可以用于like操作...
  • u011305680
  • u011305680
  • 2017-02-22 16:13
  • 2175

hash和btree索引的区别

这两天有个很强烈的感觉就是自己在一些特别的情况下还是hold不住,脑子容易放空或者说一下子不知道怎么去分析问题了,比如,问“hash和btree索引的区别”,这很难吗,只要掌握了这两种数据结构稍加分析就能得出答案,结果是一下子不知道从何说起。进入正题吧,这两者有啥区别。 1. hash索引查找数据...
  • tonyXf121
  • tonyXf121
  • 2012-09-13 22:23
  • 14129

数据库常见索引解析(B树,B-树,B+树,B*树,位图索引,Hash索引)

B树        即二叉搜索树:        1.所有非叶子结点至多拥有两个儿子(Left和Right);     ...
  • wl044090432
  • wl044090432
  • 2016-12-01 16:56
  • 4240

hash算法原理详解

一.概念 哈希表就是一种以 键-值(key-indexed) 存储数据的结构,我们只要输入待查找的值即key,即可查找到其对应的值。 哈希的思路很简单,如果所有的键都是整数,那么就可以使用一个简单的无序数组来实现:将键作为索引,值即为其对应的值,这样就可以快速访问任意键的值。这是对于简单的键的情况,...
  • tanggao1314
  • tanggao1314
  • 2016-05-19 22:35
  • 57908

hash索引跟B树索引的区别

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

B树和hash的区别与联系

关系型数据库中,索引大多采用B/B+树来作为存储结构,而全文搜索引擎的索引则主要采用hash的存储结构,这两种数据结构有什么区别? hash结构的特点:检索效率非常高,索引的检索可以一次到位,O(1)。B树需要从根节点到枝节点,最后才能到叶节点进行多次I/O操作,所以hash的效率远远高于...
  • ranjea
  • ranjea
  • 2013-05-18 18:20
  • 2066

索引基础——B-Tree、B+Tree、红黑树、B*Tree数据结构

B树(B-Tree,并不是B“减”树,横杠为连接符,容易被误导)        是一种多路搜索树(并不是二叉的):        1.定义任意非叶子结点最多只...
  • zhangliangzi
  • zhangliangzi
  • 2016-05-10 23:10
  • 6248

Oracle学习笔记(一)——B-Tree索引

目录是索引的一个最好的例子,每条目录包含对应章节的标题和页码,类比索引的每条索引项包含了数据记录的某些键值组合并包含了对应数据块的访问路径(rowid)。目录的存在就是为了快速定位到感兴趣的内容,索引的存在也是问了加快对表数据的随机访问。        ...
  • biww620
  • biww620
  • 2017-06-10 19:31
  • 278

MySQL中B+Tree索引原理

转自:http://blog.csdn.net/u013235478/article/details/50625677 B+树索引是B+树在数据库中的一种实现,是最常见也是数据库中使用最为频繁的一种索引。B+树中的B代表平衡(balance),而不是二叉(binary),因...
  • IFollowRivers
  • IFollowRivers
  • 2017-06-23 11:06
  • 3486
    个人资料
    • 访问:5237274次
    • 积分:38040
    • 等级:
    • 排名:第121名
    • 原创:241篇
    • 转载:35篇
    • 译文:163篇
    • 评论:1576条
    个人微博
    最新评论
    文章存档