MySQL hash index VS Btree index

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

   MySQL AHI(adaptive hash index):没有牺牲任何的事物特点和可靠性;

   根据搜索的匹配模式,MySQL会利用 B-Tree index key 前半部分(利用btree index 所能找到的部分)长度任意建立hash index。hash index根据需求只对访问频率较高的page中的index建立hashindex

   如果一个表的数据全部在内存里面,hash index可以加快查询速度;innodb本身有监控index 查询频率的机制;通过hash index提高查询的性能远远高于监控index查询频率和维护 hash index结构开销。对于多并发连接的情况, read/write lock 会对hash index 造成竞争锁,当有部分 where column like  匹配模式的情况下,自适应哈希是不适合的,建议关闭。这种情况也很难预测是否这样的特性适合这样特殊的应用的场景。

   对于innodb adaptive hash 部分的使用情况:

   可以使用 show engine innodb status\G 中 SEMAPHORES部分查看,如果有很多thread处 于 waiting on an RW-latch created in btr0sea.c,这个时候关闭自适应哈希是比较合适的。

   B-Tree 和 Hash index 的比较:

   了解 B-Tree 和 Hash 的数据结构对于我们预测在不同存储引擎上查询(利用使用这些结构index)的性能是很有帮助的,特别对于memory 存储引擎;

   B-Tree index的特点:

   B-tree 索引可以用于进行 =,>,>=,<,<= 和 between的计算,同样可以用于 like 匹配模式的查询;

   SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%';(可以使用索引)
   SELECT * FROM tbl_name WHERE key_col LIKE 'Pat%_ck%';(也可以使用索引)
   SELECT * FROM tbl_name WHERE key_col LIKE '%Patrick%';(不会使用索引)

   对于第三个查询语句,MySQL会使用Turbo Boyer-Moore 算法来初始化 这个pattern,来更快的进行查找。

   如果某个子都 col_name被索引, col_name is null 会采用索引。

   btree 索引倾向于最左原则,尤其是在where and条件中,第一个字段是必须要引用上的;

   以下例句是会用上索引的:
     WHERE index_part1=1 AND index_part2=2 AND other_column=3
     WHERE index=1 OR A=10 AND index=2 (能够使用index1 或者 index2)
     WHERE index_part1='hello' AND index_part3=5
     WHERE index1=1 AND index2=2 OR index1=3 AND index3=3;(可以用上index1,但不一定能用上 index2,index3)

   下面的例句不会使用上索引:
     WHERE index_part2=1 AND index_part3=2;(index_part1 不会被用上)
     WHERE index=1 OR A=10 (不会使用索引)
     WHERE index_part1=1 OR index_part2=10(不会使用索引)

   特殊情况:有些情况MySQL是不会使用索引的,尽管被查询字段有索引,
     当MySQL optimizer estimates (优化模型)使用索引会扫描大部分的rows,这种情况下 table scan 全表扫描可能会因为更少的查找来降低成本。此时如果使用limit 语句,来索取一定量的rows这样会使用上索引。

   hash  index特征:
   只能进行等值运算,不能进行< 或者 范围查找运算,这种比较适合 kv类型的数据,
   对于order by 语句是不能使用hash key的,可以在程序中搞定。
   MySQL 不能确定大致在两个values 之间到底还有多少rows。对于myisam 转换为memory引擎的情况需要注意。
   索引的键值必须全部用上,不能像btree那样只使用前半部分。






本文转自 位鹏飞 51CTO博客,原文链接:http://blog.51cto.com/weipengfei/1211579,如需转载请自行联系原作者

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
6天前
|
关系型数据库 MySQL 索引
【MySQL 解析】Hash索引和B+树索引对比分析
【1月更文挑战第11天】【MySQL 解析】Hash索引和B+树索引对比分析
|
6天前
|
存储 关系型数据库 MySQL
MySQL的优化利器⭐️Multi Range Read与Covering Index是如何优化回表的?
本文以小白的视角使用通俗易懂的流程图深入浅出分析Multi Range Read与Covering Index是如何优化回表
|
6天前
|
SQL 关系型数据库 MySQL
mysql查询语句的访问方法const、ref、ref_or_null、range、index、all
mysql查询语句的访问方法const、ref、ref_or_null、range、index、all
|
6天前
|
关系型数据库 MySQL 索引
mysql中force index强制索引
mysql中force index强制索引
14 0
|
6天前
|
关系型数据库 MySQL 数据处理
MySQL vs. PostgreSQL:选择适合你的开源数据库
在当今信息时代,开源数据库成为许多企业和开发者的首选。本文将比较两个主流的开源数据库——MySQL和PostgreSQL,分析它们的特点、优势和适用场景,以帮助读者做出明智的选择。
|
6天前
|
关系型数据库 MySQL
mysql 5.5.62版本建表语句报错: Index column size too large. The maximum column size is 767 bytes
mysql 5.5.62版本建表语句报错: Index column size too large. The maximum column size is 767 bytes
|
6天前
|
关系型数据库 MySQL
MySQL【问题 02】报错 1709 - Index column size too large. The maximum column size is 767 bytes. 可能是最简单的方法
MySQL【问题 02】报错 1709 - Index column size too large. The maximum column size is 767 bytes. 可能是最简单的方法
75 0
|
10月前
|
存储 关系型数据库 MySQL
为什么MySQL索引使用B+树而不用hash表和B树
支持范围查询:B+树索引在数据结构上有序排列,可以有效支持范围查询,例如大于、小于、区间查询等操作。而哈希表无法支持范围查询,只能进行精确查找,而B树在范围查询操作时性能相对较低。
165 0
|
6月前
|
关系型数据库 MySQL 数据库
Mysql中key与index区别
Mysql中key与index区别
|
7月前
|
存储 SQL 关系型数据库
MySQL 优化 index merge(索引合并)引起的死锁分析(强烈推荐)
生产环境出现死锁流水,通过查看死锁日志,看到造成死锁的是两条一样的update语句(只有where条件中的值不同),如下: