Welcome 微信登录

首页 / 数据库 / MySQL / MySQL索引之哈希索引

哈希索引(Hash Index)建立在哈希表的基础上,它只对使用了索引中的每一列的精确查找有用。对于每一行,存储引擎计算出了被索引的哈希码(Hash Code),它是一个较小的值,并且有可能和其他行的哈希码不同。它把哈希码保存在索引中,并且保存了一个指向哈希表中的每一行的指针。在mysql中,只有memory存储引擎支持显式的哈希索引。如果多个值有相同的哈希码,索引就会把行指针以链表的方式保存在哈希表的同一条记录中。哈希索引的细节还有很多,由于myISAM和innodb并不支持,所以在这里不详解。下面着力讲解建立自己的MySQL哈希索引想法非常简单,在标准的B-Tree索引上创建一个伪哈希索引。它和真正的哈希索引不是一回事,因为它还是使用B-Tree索引进行查找。然而,它将会使用键的哈希值进行查找,而不是键自身。你所要做的事情就是在where子句中手动地定义哈希函数。例子:URL查找。URL通常会导致B-Tree索引变大,因为它们非常长。通常会按照下面的方式来查找URL表。mysql>select id from url where url="http://www.linuxidc.com";但是,如果移除掉url列上的索引并且给表添加一个被索引的url_src列,就可以按照下面的方式进行查询:mysql>select id from url where url="http://www.linuxidc.com" and url_src=CRC32("http://www.linuxidc.com");mysql查询优化器注意到url_src列上有很小的,选择性很高的索引,并且它会使用里面的值进行索引查找。即使有几列相同的url_src值,也很容易进行精确的对比来确定需要的行。替代方案是把完整的URL索引为字符串,它要慢很多。这个办法的一个缺点就是要维护哈希值。你可以手工进行维护,在mysql5.0 以上版本中,可以使用触发器来进行维护。1.创建一个表:
  1. create table pseudohash(
  2.     id int unsigned NOT NULL auto_increment,   
  3.     url varchar(255) NOT NULL,   
  4.     url_src int unsigned NOIT NULL DEFAULT 0,   
  5.     PRIMARY KEY(id)   
  6. );  
接下来创建触发器。我们先暂时更新一下命令分隔符,这样就可以在触发器中使用分号:
  1. DELIMITER |
  2. CREATE TRIGGER pseudohash_src_ins BEFORE INSERT ON pseudohash FOR EACH ROW BEGIN SET NEW.url_src = crc32(NEW.url);   
  3. END;   
  4. |   
  5. CREATE TRIGGER pseudohash_src_upd BEFORE UPDATE ON pseudohash FOR EACH ROW BEGIN SET NEW.url_src = crc32(NEW.url);   
  6. END;   
  7. |   
  8. DELIMITER;
剩下的工作就是验证触发器自动维护了哈希值。如果使用这种方式,就不应该使用SHA1()和MD5()这此哈希函数。它们返回很长的字符串,会浪费大量的存储空间并且减慢比较速度。它们是强加密函数,被设计为不产生任务冲突。这并不是我们的目标。简单的哈希函数能在有较好性能的同时保证可接受的冲突率。当然,如果表有很多行并且CRC32()产生了很多冲突,就要实现自己的64位哈希函数,要确保自己的函数返回整数,而不是字符串。mysql>select conv(right(md5("http://www.linuxidc.com/"),16),16,10) as hash64;MySQL索引之前缀索引和索引选择性MySQL索引之隔离列相关资讯      MySQL索引 
  • MySQL中索引和优化的用法总结  (今 14:24)
  • MySQL 全索引扫描的bug  (11/11/2015 14:04:56)
  • MySQL索引和优化查询  (05/17/2015 14:16:03)
  • MySQL索引下推技术  (02月23日)
  • MySQL (ICP) 索引条件下推对比  (09/17/2015 19:11:44)
  • MySQL理解索引、添加索引的原则  (05/17/2015 14:15:05)
本文评论 查看全部评论 (0)
表情: 姓名: 字数


评论声明
  • 尊重网上道德,遵守中华人民共和国的各项有关法律法规
  • 承担一切因您的行为而