MYSQL教程mysql索引教程之哈希索引

MYSQL教程mysql索引教程之哈希索引,第1张

概述介绍《MYSQL教程mysql索引教程之哈希索引》开发教程,希望对您有用。

《MysqL教程MysqL索引教程之哈希索引》要点:
本文介绍了MysqL教程MysqL索引教程之哈希索引,希望对您有用。如果有疑问,可以联系我们。

导读:本节内容:MysqL索引之哈希索引哈希索引(Hash Index)建立在哈希表的基础上,它只对使用了索引中的每一列的精确查找有用.对于每一行,存...

MysqL必读本节内容:
MysqL索引之哈希索引

MysqL必读哈希索引(Hash Index)建立在哈希表的基础上,它只对使用了索引中的每一列的精确查找有用.
对于每一行,存储引擎计算出了被索引的哈希码(Hash Code),它是一个较小的值,并且有可能和其他行的哈希码不同.
它把哈希码保存在索引中,并且保存了一个指向哈希表中的每一行的指针.

MysqL必读在MysqL中,只有memory存储引擎支持显式的哈希索引.如果多个值有相同的哈希码,索引就会把行指针以链表的方式保存在哈希表的同一条记录中.

MysqL必读哈希索引的细节还有很多,由于myISAM和innodb并不支持,所以在这里不详解.

MysqL必读下面着力讲解建立自己的哈希索引

MysqL必读想法非常简单,在标准的B-Tree索引上创建一个伪哈希索引.它和真正的哈希索引不是一回事,因为它还是使用B-Tree索引进行查找.然而,它将会使用键的哈希值进行查找,而不是键自身.你所要做的事情就是在where子句中手动地定义哈希函数.

MysqL必读例子:URL查找.
URL通常会导致B-Tree索引变大,因为它们非常长.通常会按照下面的方式来查找URL表.
 

MysqL>select ID from url where url='http://www.jbxue.com';

MysqL必读但是,如果移除掉url列上的索引并且给表添加一个被索引的url_src列,就可以按照下面的方式进行查询:
 

MysqL>select ID from url where url='http://www.jbxue.com' and url_src=CRC32('http://www.jbxue.com');

MysqL必读mySQL查询优化器注意到url_src列上有很小的,选择性很高的索引,并且它会使用里面的值进行索引查找.即使有几列相同的url_src值,也很容易进行精确的对比来确定需要的行.替代方案是把完整的URL索引为字符串,它要慢很多.

MysqL必读这个办法的一个缺点就是要维护哈希值.
可以手工进行维护,在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) 
); 
 

MysqL必读接下来创建触发器.我们先暂时更新一下命令分隔符,这样就可以在触发器中使用分号:
 

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; 
 

MysqL必读剩下的工作就是验证触发器自动维护了哈希值.
如果使用这种方式,就不应该使用SHA1()和MD5()这此哈希函数.它们返回很长的字符串,会浪费大量的存储空间并且减慢比较速度.它们是强加密函数,被设计为不产生任务冲突.这并不是我们的目标.简单的哈希函数能在有较好性能的同时保证可接受的冲突率.当然,如果表有很多行并且CRC32()产生了很多冲突,就要实现自己的64位哈希函数,要确保自己的函数返回整数,而不是字符串.
 

MysqL>select conv(right(md5('http://www.jbxue.com/'),16),16,10) as hash64; 总结

以上是内存溢出为你收集整理的MYSQL教程mysql索引教程之哈希索引全部内容,希望文章能够帮你解决MYSQL教程mysql索引教程之哈希索引所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/1159334.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-01
下一篇 2022-06-01

发表评论

登录后才能评论

评论列表(0条)

保存