MySQL创建自定义哈希索引

如果存储引擎不支持哈希索引,则可以模拟像Memory存储引擎一样创建哈希索引,这样可以享受哈希索引的便利,例如只需要很小的索引就可以为超长的键创建索引。

思路很简单:在B-Tree基础上创建一个伪哈希索引。这和真正的哈希索引不是一回事。因为还是使用真正的哈希索引进行查找,但是它使用哈希值而不键本身进行索引查找。你需要做的就是在查询的where子句中手动指定使用哈希函数。

下面我们来看一个例子:

我们可能会存储大量的url,并需要根据url进行搜索查找。如果使用B-Tree来存储URL,存储的内容就会很大,因为URL本身都很长。正常情况下,我们会在url列上建立索引,使用如下的方式来查找特定的url。

创建url列上的索引

插入一条数据

你可能会使用这种方式来查询

这种方式可见的坏处就是url本身可能很长,使用B-Tree存储的内容太大。

解决方法就是删除掉url列上的索引,而新增一个被索引的url_crc列

如下面操作:

使用CRC32做哈希,就可以使用下面这中方式查询:

where查询条件

这样做的性能就会很高,因为mysql优化器会使用这个选择性很高而体积很小的基于url_crc列的索引来完成查询。即使有很多个记录有相同的索引值,查找仍然很快,只需要根据哈希值做快速的整数比较就能找到索引条目,然后一一比较返回对应的行。对完整的URL字符串做索引,那就会非常慢。。。。

处理哈希冲突的情况:要避免冲突问题,必须在where条件中带入哈希值和对应列值。

如果采用这种方式,记住不要使用SHA1()和MD5()作为哈希函数。因为这两个哈希函数计算出来的哈希值是非常长的字符串,会浪费大量空间,比较时也会更慢。

创建触发器,维护哈希值

查看触发器

测试触发器