哈希索引(Hash Index)建立在哈希表的基础上,它只对使用了索引中的每一列的精确查找有用。对于每一行,存储引擎计算出了被索引的哈希码(Hash Code),它是一个较小的值,并且有可能和其他行的哈希码不同。它把哈希码保存在索引中,并且保存了一个指向哈希表中的每一行的指针。
在mysql中,只有memory存储引擎支持显式的哈希索引。如果多个值有相同的哈希码,索引就会把行指针以链表的方式保存在哈希表的同一条记录中。
哈希索引的细节还有很多,由于myISAM和innodb并不支持,所以在这里不详解。
下面着力讲解建立自己的哈希索引
想法非常简单,在标准的B-Tree索引上创建一个伪哈希索引。它和真正的哈希索引不是一回事,因为它还是使用B-Tree索引进行查找。然而,它将会使用键的哈希值进行查找,而不是键自身。你所要做的事情就是在where子句中手动地定义哈希函数。
例子:URL查找。
URL通常会导致B-Tree索引变大,因为它们非常长。通常会按照下面的方式来查找URL表。
mysql>select id from url where url='http://www.mysql.com';
但是,如果移除掉url列上的索引并且给表添加一个被索引的url_src列,就可以按照下面的方式进行查询:
mysql>select id from url where url='http://www.mysql.com' and url_src=CRC32('http://www.mysql.com');
mysql查询优化器注意到url_src列上有很小的,选择性很高的索引,并且它会使用里面的值进行索引查找。即使有几列相同的url_src值,也很容易进行精确的对比来确定需要的行。替代方案是把完整的URL索引为字符串,它要慢很多。
这个办法的一个缺点就是要维护哈希值。你可以手工进行维护,在mysql5.0 以上版本中,可以使用触发器来进行维护。
1.创建一个表:
create table pseudohash(
id int unsigned NOT NULL auto_increment,
url varchar(255) NOT NULL,
url_src int unsigned NOIT NULL DEFAULT 0,
PRIMARY KEY(id)
);
接下来创建触发器。我们先暂时更新一下命令分隔符,这样就可以在触发器中使用分号:
DELIMITER |
CREATE TRIGGER pseudohash_src_ins BEFORE INSERT ON pseudohash FOR EACH ROW BEGIN SET NEW.url_src = crc32(NEW.url);
END;
|
CREATE TRIGGER pseudohash_src_upd BEFORE UPDATE ON pseudohash FOR EACH ROW BEGIN SET NEW.url_src = crc32(NEW.url);
END;
|
DELIMITER;
剩下的工作就是验证触发器自动维护了哈希值。
如果使用这种方式,就不应该使用SHA1()和MD5()这此哈希函数。它们返回很长的字符串,会浪费大量的存储空间并且减慢比较速度。它们是强加密函数,被设计为不产生任务冲突。这并不是我们的目标。简单的哈希函数能在有较好性能的同时保证可接受的冲突率。当然,如果表有很多行并且CRC32()产生了很多冲突,就要实现自己的64位哈希函数,要确保自己的函数返回整数,而不是字符串。
mysql>select conv(right(md5('http://www.mysql.com/'),16),16,10) as hash64;
分享到:
相关推荐
- **哈希索引(HASH索引)**:在MEMORY和NDB存储引擎中使用。 - **位图索引(BITMAP索引)**:MySQL目前不支持这种索引类型。 - **全文索引(FULLTEXT索引)**:MyISAM和InnoDB(自MySQL 5.6版本起)支持全文索引。 ...
- **哈希索引** #### 二、B+树索引 **B+树的特点:** - **平衡性:** B+树是平衡的m路搜索树,保证了树的高度相对较低,从而减少磁盘I/O操作次数。 - **键值分布:** 在B+树中,所有的键值都会出现在叶子节点上,...
### 索引介绍:聚集索引与非聚集索引 #### 一、索引的基本概念 在数据库中,索引是一种特殊的文件结构,它的主要目的是为了提高数据检索的速度。索引通过创建一种数据结构(例如B树)来实现这一点,这种结构允许...
MySQL索引知识是数据库管理中至关重要的一部分,它能显著提高数据查询的速度,特别是在处理大量数据时。索引就像书的目录,使得数据检索更为高效。MySQL中的索引主要有两种存储类型:BTREE(B树)和HASH。 1. **...
MySQL数据库支持多种索引类型,包括B-Tree索引、哈希索引和全文索引等。B-Tree索引由于其通用性和高效性,是MySQL中最常用的索引类型。本文档主要讨论B-Tree索引,具体包括B-Tree和B+Tree的数据结构特点、MySQL索引...
在MySQL中,最常见的索引类型有B-Tree索引、哈希索引、全文索引和空间索引等。 1. **B-Tree索引**:这是最常用的索引类型,适用于范围查询和排序操作。B-Tree索引中的键值是有序的,因此可以快速定位到数据行。 2....
本章主要探讨了MySQL索引的概念、类型以及它们的作用和影响。 首先,索引是一种辅助数据结构,它的存在是为了提高数据查询的效率。不同于数据在硬盘上的物理顺序,索引提供了另一种逻辑上的数据排序方式。索引的...
- **哈希索引**:适用于等值查询,但不支持范围查询。 - **RTree索引**:用于空间索引。 - **全文索引**:在MySQL 5.5及更高版本中得到支持,主要用于全文搜索。 ### 触发器 触发器是一种特殊类型的存储过程,它...
2. **哈希索引**:哈希索引利用哈希函数将索引字段转换为哈希值,然后将哈希值与数据的存储位置进行映射。哈希索引在等值查询时非常高效,但不支持范围查询,因此在实际应用中并不常用。 3. **全文索引**:主要用于...
特别需要说明的是, MySQL支持诸多存储引擎,而各种存储引擎对 索引的支持也各不相同,因此MySQL数据库支 持多种索引类型,如BTree索引,哈希索引, 全文索引等等。为了避免混乱,本文将只关注 于BTree索引,因为这...
本文将深入探讨MySQL索引的基础知识,帮助你理解如何有效地利用索引来提升查询速度。 首先,我们需要了解索引是什么。在数据库中,索引就像书籍的目录,它提供了一种快速定位数据的方法,避免了全表扫描。MySQL支持...
2. Hash 索引:是一种基于哈希表的索引,它可以快速定位数据。 3. Full-Text 索引:是一种基于全文搜索的索引,它可以快速搜索文本数据。 结论 MySQL 索引是一种非常重要的数据结构,它可以帮助快速定位和检索数据...
- **哈希索引**:提供快速的等值匹配,但不支持范围查询和排序。 - **全文索引**:用于全文搜索,通过分词技术找到含有特定词汇的记录。 - **空间索引**:用于地理或图像数据,如R-Tree索引。 2. **索引创建** ...
- **按数据结构分类**: B-Tree索引、哈希索引、R-Tree索引等。 - **B-Tree索引**: 最常见的索引结构之一,适用于大多数场景。 - **哈希索引**: 适用于查找操作,但在更新时可能会出现瓶颈。 - **R-Tree索引**: ...
- **哈希索引**:用于等值查询,速度非常快,但不支持排序和范围查询。 - **全文索引**:针对文本字段的搜索,提供模糊匹配功能。 - **空间索引**:用于处理地理空间数据。 2. **索引的选择性** - **选择性越高...
哈希索引的查询效率取决于哈希冲突的频率。 3. **RTREE索引**:主要用于地理空间数据,如MyISAM存储引擎。它支持多维坐标系统的搜索,常用于处理地理位置信息。 4. **FULLTEXT索引**:适用于全文搜索,MyISAM存储...
MySQL索引是帮助数据库高效获取数据的数据结构,根据MySQL官方定义,索引本质上是一种数据结构。它能够加快数据检索速度,因为索引使得数据库能够使用高级查找算法进行快速定位数据。在数据库中,基本的查询算法是...
另外,MySQL还支持哈希索引(Hash Index),尤其适用于等值查询,因为哈希索引的查找时间复杂度为O(1)。但哈希索引不支持范围查询和排序,且占用更多的内存。 在创建索引时,应考虑以下几点: 1. 避免选择过大的...