高性能的MySQL(5)创建高性能的索引一哈希索引

哈希索引(hash index)基于哈希表实现,只有精确匹配索引的所有列的查询才有效,对于每一行数据,存储引擎都会对所有索引列计算一个哈希码,不同键值的行计算出来的哈希码也不一样,哈希码保存在哈希索引中,同时哈希表中保存指向每个数据的指针。

1、Memory引擎支持哈希索引,也支持B-Tree索引,而且支持非唯一的哈希索引,如果多个列的哈希值相同,索引会以链表的方式存放多个记录指针到同一个哈希条目,这个是和特别的。

举例说明:

CREATE TABLE `testhash` (
  `fname` varchar(50) NOT NULL,
  `lname` varchar(50) NOT NULL,
  KEY `fname` (`fname`) USING HASH
) ENGINE=MEMORY DEFAULT CHARSET=utf8 |

假设索引使用f()生成哈希码如下

f('Arjen') = 2323
f('Baron') = 7437
f('Peter') = 8784
f('Vadim') = 2458

则哈希索引数据结构如下

注意哈希码是有序的,但是数据行不是。

当执行查询的时候

select * from testhash where fname='Peter';

先计算哈希码,然后找到第3行指针,最后比较第3行的值是否为‘Peter’,以确定就是要找的行。

2、哈希索引的限制:

a、哈希索引只包含哈希码和行指针,不存储字段值,所以无法用索引中的值来避免去读取行。

b、哈希索引数据并不是按照索引值顺序存储的,所以也就无法用于排序。

c、哈希索引也不支持部分索引列匹配查找,必须利用所有索引列,因为哈希值是通过所有索引列计算的。

d、哈希索引只支持等值比较查询,包括=、in()、<=>(安全比较)比较包含null的时候用。哈希也不支持任何范围查询,比方说where price > 100

e、哈希索引非常快,除非有哈希冲突(不同的索引值会有相同的哈希值),这个时候引擎必须遍历链表中的所有行来匹配。

f、哈希冲突较多的时候,比方列上相同的值比较多的时候,索引维护代价就会比较高。

InnoDB引擎有一个特殊的功能叫做“自适应哈希索引”,由引擎内部实现,也可以关闭。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索指针
, 数据
, 索引
, 链表查询
, 引擎
, 表中的字段也不相同
, 哈希
, 支持
, mysql遍历存储
, 冲突不匹配值
, 哈希图javaandroid
, 索引值
哈希索引原理
mysql 创建哈希索引、mysql 自适应哈希索引、mysql 哈希索引、高性能mysql 索引、mysql 创建索引,以便于您获取更多的相关知识。

时间: 2025-01-01 04:21:54

高性能的MySQL(5)创建高性能的索引一哈希索引的相关文章

SQL Server2014 哈希索引原理详解_MsSql

当一个key-value键值对传递给一个哈希函数的时候,经过哈希函数的计算之后,根据结果会把key-value键值对放在合适的hash buckets(哈希存储桶)里 举个栗子 我们假设对10取模( % 10 )就是哈希函数.如果key-value键值对的key是1525 ,传递到哈希函数,那么1525 会存放在第五个bucket里 因为5 as 1525 % 10 = 5. 同样,537 会存放在第七个bucket ,2982 会存放在第二个bucket ,依次类推 同样,在hash inde

SQL Server2014 哈希索引原理详解

当一个key-value键值对传递给一个哈希函数的时候,经过哈希函数的计算之后,根据结果会把key-value键值对放在合适的hash buckets(哈希存储桶)里 举个栗子 我们假设对10取模( % 10 )就是哈希函数.如果key-value键值对的key是1525 ,传递到哈希函数,那么1525 会存放在第五个bucket里 因为5 as 1525 % 10 = 5. 同样,537 会存放在第七个bucket ,2982 会存放在第二个bucket ,依次类推 同样,在hash inde

高性能的MySQL(5)索引策略-索引和表的维护

维护表有三个主要的目的: 1.找到并修复损坏的表. 对于MyISAM存储引擎来说,表损坏通常是系统崩溃导致的.其他的引擎也会由于硬件的问题,MySQL本身的缺陷或者操作系统的问题导致索引的损坏. 损坏的索引,会导致查询返回错误的结果或者莫须有的主键冲突等问题,严重时还会导致数据库崩溃. 这类情况,可以尝试check table来检查是否发生了表损坏,有些存储引擎不支持这个命令. 可以使用repair table 来修复损坏的表,但同样不是所有引擎都支持该命令. 如果引擎不支持,可以使用alter

高性能的MySQL(5)索引策略一压缩,冗余,重复,索引和锁

一.压缩索引 MyISAM使用前缀压缩来减少索引的大小,默认只压缩字符串,但是通过设置也可以对整数做压缩. 压缩可以使用更少的空间,代价是某些操作可能更慢.特别是倒序的查询,测试表明,对于CPU密集型的应用,查询会很慢,特别是倒序.对于I/O密集型应用,查询可能会不错. 可以在CREATE TABLE的语句中指定PACK_KEYS参数来指定索引压缩方式. 二.冗余和重复索引 重复索引:指在相同的列上按照相同的顺序创建的相同类型的索引,要尽量避免重复索引,除非在同一列上创建不同类型的索引来满足不同

高性能的MySQL(5)索引策略-覆盖索引与索引排序

一.覆盖索引 索引是一种查找数据的高效方式,但是MySQL也可以使用索引来直接获取列的数据,这样就不再需要读取数据行.如果索引的叶子节点中已经包含要查询的数据,那么还有什么必要回表查询呢? 如果一个索引包含或者说覆盖所有需要查询的字段的值,我们就称之为"覆盖索引". 覆盖索引的好处: 1.索引条目通常远小于数据行大小,所以如果只需要读取索引,就极大的减少数据访问量.这对MyISAM尤其正确,因为MyISAM能压缩索引以变得更小. 2.因为索引是按照顺序存储的,所以对于I/O密集型的范围

【转载】低成本和高性能的MySQL云数据库的实现淘宝 MySQL

低成本和高性能的MySQL云数据库的实现 作者: 鸣嵩/曹伟(集团技术专家) 本文刊登于<程序员>杂志2012年12期上,转载请注明         UMP(Unified MySQL Platform)系统是淘宝核心系统数据库团队开发的低成本和高性能的MySQL云数据方案,关键模块采用Erlang语言实现.系统中包含了controller服务器.proxy服务器.agent服务器.API/Web服务器.日志分析服务器.信息统计服务器等组件,并且依赖于Mnesia.LVS.RabbitMQ.Z

mysql大内存高性能优化方案

8G内存下MySQL的优化 按照下面的设置试试看: key_buffer = 3840M max_allowed_packet = 16M table_cache = 1024 sort_buffer_size = 32M read_buffer_size = 32M read_rnd_buffer_size = 32M myisam_sort_buffer_size = 256M thread_cache_size = 32 query_cache_size = 256M # Try numb

高性能的MySQL(6)查询慢与重构查询

只有好的库表结构.合理的索引还不够,我们还需要合理的设计查询,齐头并进,一个不少才能充分发挥MySQL的优势. 一.查询为什么会慢? 每一个查询由一系列的子任务组成,每个子任务都会消耗一定的时间.这个我们在之前的单个查询分析时已经简单介绍了,当然还有额外的因素,比方说包括网络,CPU计算,统计信息,执行计划,锁等待等操作,或者底层引擎在调用内存,CPU操作,I/O操作等上的消耗时间. 优化查询的目的就是减少和消除这些操作所花费的时间. 查询性能低下的最基本原因是访问的数据太多,大部分的性能低下的

高性能的MySQL(8)优化服务器配置:内存

配置MySQL服务器离不开配置文件,接下来就开始这一部分的内容. 首先一定要清楚配置文件的位置,如果不知道可以尝试下面的操作: /usr/local/mysql/bin/mysqld  --verbose --help | grep -A 1 'Default options' #结果如下 Default options are read from the following files in the given order: /etc/my.cnf /etc/mysql/my.cnf /usr