使用Mysql对URL进行索引

来源:互联网 发布:telnet 端口号 结果 编辑:程序博客网 时间:2024/06/07 21:08

在抓取页面的时候,很重要的一点就是要对URL进行索引,避免重复抓取。

开始想了几条路线:

一个是自己做一个索引文件,定义一个bit数组,每一位代表对应的URL是否被抓取过(0或1)。对URL进行Hash或者crc到bit数组的指定位。虽然轻便,但是要自己维护,难免不会出bug。

一个是用Lucene或者Solr,虽然简单,但是有点重量级,感觉大炮打蚊子。

一个是用mysql,对URL进行crc建立索引。最终决定用这个,直观方便也轻便。


首先根据需要建表:

create table url_visit_times (   id int auto_increment,  url varchar(255) not null,  url_crc int unsigned not null default 0,  primary key (id))

其中url_crc是对URL进行一个模拟哈希。

对url_crc建立索引。


再建立相应触发器:

delimiter //create trigger url_crc before insert on url_visit_times for each row beginset new.url_crc = crc32(new.url);end//create trigger url_crc_update before update on url_visit_times for each row beginset new.url_crc = crc32(new.url);end//delimiter ;

触发器的作用是简化操作,在插入数据的时候可以不计算crc,触发器会自动计算并插入。


附上一点触发器相关的知识:

CREATE TRIGGER trigger_name trigger_time trigger_event  ON tbl_name FOR EACH ROW trigger_stmt

trigger_time是触发程序的动作时间。它可以是BEFORE或AFTERtrigger_event指明了激活触发程序的语句的类型。trigger_event可以是下述值之一:

·             INSERT:将新行插入表时激活触发程序,例如,通过INSERT、LOAD DATA和REPLACE语句。
·             UPDATE:更改某一行时激活触发程序,例如,通过UPDATE语句。
·             DELETE:从表中删除某一行时激活触发程序,例如,通过DELETE和REPLACE语句。
可能遇到的问题:
如果你在触发器里面对刚刚插入的数据进行了 insert/update, 会造成循环的调用.
            如:
             create trigger test before update on test for each row update test set NEW.updateTime = NOW() where id=NEW.ID; END
            应该使用set:
            create trigger test before update on test for each row set NEW.updateTime = NOW(); END


触发器 与存储过程
           触发程序不能调用将数据返回客户端的存储程序,也不能使用采用CALL语句的动态SQL(允许存储程序通过参数将数据返回触发程序)。 
          而存储过程  可以接受参数,将结果范围给应用程序。

Before与After区别:before:(insert、update)可以对new进行修改。
                   after不能对new进行修改。
                   两者都不能修改old数据。

0 0
原创粉丝点击