B-Tree 索引和 Hash 索引的对照
对于 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。
B-Tree 索引和 Hash 索引的对照的更多相关文章
- mysql索引(btree索引和hash索引的区别)
所有MySQL列类型可以被索引.根据存储引擎定义每个表的最大索引数和最大索引长度.所有存储引擎支持每个表至少16个索引,总索引长度至少为256字节.大多数存储引擎有更高的限制. 索引的存储类型目前只有 ...
- MySQL的btree索引和hash索引的区别
Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-T ...
- B+索引、Hash索引、数据类型长度
1.为什么在数据库中要用B树索引而不是Hash索引? Mysql Hash索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这 ...
- MySQL的btree索引和hash索引的区别 (转)
Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-T ...
- 数据库索引(BTree索引和Hash索引)
索引 索引是为了方便查找我们所需要的数据. mysql支持的索引数据类型 B-Tree索引的特点 B-Tree索引以B+Tree(树)的结构存储数据. B-Tree索引能够加快数据的查询速度: B-T ...
- MySQL的B+树索引和hash索引的区别
简述一下索引: 索引是数据库表中一列或多列的值进行排序的一种数据结构:索引分为聚集索引和非聚集索引,聚集索引查询类似书的目录,快速定位查找的数据,非聚集索引查询一般需要再次回表查询一次,如果不使用索引 ...
- MySQL索引类型 btree索引和hash索引的区别
来源一 Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 ...
- 14的路 MySQL的btree索引和hash索引的区别
http://www.cnblogs.com/vicenteforever/articles/1789613.html ash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tr ...
- SQLServer中间接实现函数索引或者Hash索引
本文出处:http://www.cnblogs.com/wy123/p/6617700.html SQLServer中没有函数索引,在某些场景下查询的时候要根据字段的某一部分做查询或者经过某种计算之后 ...
- 索引原理-btree索引与hash索引的区别
btree索引与hash索引的区别,之前不清楚,mark一下. Hash索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree索引需要从根节点到枝节点,最后才能访问到页节点这样多 ...
随机推荐
- hard fault 学习记录
使用 segger 的 hard fault 的源文件后,当调试时,发生硬件错误的时候,可以查看 HardFaultRegs 中的内容,并对比 segger_HardFaultHandler.c 中的 ...
- chrome ubuntu启动不了
安装好后,点击图标没反应 用命令行运行chrome并显示log:google-chrome --enable-logging=stderr --log-level=4 报错如下: 解决:安装更高版本的 ...
- 微信小程序---宿主环境
(1)宿主环境 我们称微信客户端给小程序所提供的环境为宿主环境.小程序借助宿主环境提供的能力,可以完成许多普通网页无法完成的功能.之前把小程序涉及到的文件类型阐述了一遍,接下来结合demo项目来讲一下 ...
- Opencv竟然有中文资料
最近对于OpenCV看的较多,竟然不知不觉找到了一个中文网站,对于母语真的桥开心的嘻嘻 直方图均衡化: http://www.opencv.org.cn/opencvdoc/2.3.2/html/do ...
- [BZOJ3940]:[Usaco2015 Feb]Censoring(AC自动机)
题目传送门 题目描述: FJ把杂志上所有的文章摘抄了下来并把它变成了一个长度不超过105的字符串S.他有一个包含n个单词的列表,列表里的n个单词记为t1…tN.他希望从S中删除这些单词.FJ每次在S中 ...
- HTTP初步了解
HTTP协议简介 HTTP(超文本传输协议)是应用层上的一种客户端/服务端模型的通信协议,它由请求和响应构成,且是无状态的.(暂不介绍HTTP2) 协议 协议规定了通信双方必须遵循的数据传输格式,这样 ...
- sqlserver差异备份3117
1.出现错误"3117" 2.完整备份/选项/不对数据库执行任何操作 3.数据库显示"正在还原" 4.差异备份/选项/回滚 5.数据库完整备份与差异备份成功
- php微信公众号开发之快递查询
[文章来源:脚本之家 文章地址:https://www.jb51.net/article/149205.htm] 本文实例为大家分享了php微信公众号开发之快递查询的具体代码,供大家参考,具体内容 ...
- MySQL字符集设定与查询
一.字符集设定 MySQL数据库允许对服务器.数据库.数据表.数据列级别的字符集作出互不影响的设定. 1.对服务器字符集设定是通过配置文件中选项character-set-server 设置,如 ch ...
- centos6 下FastDFS 在storage节点上nginx的fastdfs-nginx-module 模块编译出现的问题
centos6.6 下FastDFS 在storage节点上 make(编译)nginx的fastdfs-nginx-module 出现如下报错: /root/fastdfs-nginx-mo ...