嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

周梦康 发表于 2015-06-14 7629 次浏览 标签 : Mysql

免费领取阿里云优惠券 我的直播 - 《PHP 进阶之路》

例如要在 InnoDB 中索引 url(虽然大家都不会这么做,只是一个例子),而 url本身比较长.如果直接查询

select id from url where url='http://mengkang.net'

如果直接建 url 列的索引会很大,查询效率也低.

若删除原来 url 列上的索引,而新增一个被索引的 url_crc列,使用 CRC32做哈希,就可以通过下面的方式查询了:

select if from url where url='http://mengkang.net' and url_crc=CRC32('http://mengkang.net')

这样做性能会非常高,因为 MySQL 优化器会使用这个选择性很高而体积很小的的url_crc列的索引来完成查找.就选有哈希冲突,查询仍然很快,因为冲突之后需比较的行数并不多.

CREATE TABLE url_hash_test` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `url` varchar(255) NOT NULL ,
  `url_crc` int(10) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

但是有一个问题,就是这个需要维护这个哈希值(url_crc`列).通过触发器来实现.

DELIMITER //
create trigger url_insert before Insert on url_hash_test for each row
begin
set new.url_crc = crc32(new.url);
end;
//
create trigger url_update before update on url_hash_test for each row
begin
set new.url_crc = crc32(new.url);
end;
//
DELIMITER ;

嗨,老铁,欢迎来到我的博客!

如果觉得我的内容还不错的话,可以关注下我在 segmentfault.com 上的直播。我主要从事 PHP 和 Java 方面的开发,《深入 PHP 内核》作者之一。

[视频直播] PHP 进阶之路 - 亿级 pv 网站架构的技术细节与套路 直播中我将毫无保留的分享我这六年的全部工作经验和踩坑的故事,以及会穿插着一些面试中的 考点难点加分点

评论列表