1创建自定义伪hash索引
原理:在BTree数上面创建一个伪hash索引,这和真正的hash索引不是一样的,因为还是使用的b-tree进行查找,但是它使用hash值而不是建本身进行查找
1.1正常情况查询
select id from url where url ="http://www.ayugudu.top";
1.2伪hash索引查询
select id from url where url ="http://www.ayugudu.top"
and url_crc=CRC("http://www.ayugudu.top");
这样性能会提高很多,因为mysql优化器会使用体积小的url_crc进行列的索引完成查找。这样做的方式时需要维护哈希表。但我们可以使用触发器进行实现。
1.3 建表语句
CREATE TABLE preudohash (
id INT NOT NULL auto_increment,
url VARCHAR ( 255 ) NOT NULL,
url_crc INT UNSIGNED NOT NULL DEFAULT 0,
PRIMARY key ( id )
);
1.4 插入前触发器
delimiter //
CREATE TRIGGER preudohash_crc_ins BEFORE INSERT ON preudohash FOR EACH ROW
SET NEW.url_crc = CRC32( NEW.url );
1.5 更新前触发器
delimiter //
CREATE TRIGGER preudohash_crc_upd BEFORE UPDATE ON preudohash FOR EACH ROW
BEGIN SET NEW.url_crc=crc32(NEW.url);
END;
1.6 进行验证
注意:不要采用sha1以及MD5作为哈希函数,因为这个计算的hash值非常长,可以使用md5()返回值的一部分作为自定义的hash函数
delimiter //
create function HASH64(url varchar(255))
returns int
return CONV(RIGHT(MD5(url),16),16,10);
1.7 处理hash冲突
要处理hash冲突必须在where 条件带入hash值和对应列值。