使用Mysql Trigger分解URL字段并将其存储在MyISAM表中

时间:2013-07-15 19:13:53

标签: mysql triggers indexing myisam

我有一个MySQL MyISAM表,用于在url字段中存储URL。 URL始终只是方案,子域和主机(例如http://www.site.comhttps://site2.edu)。

我需要将Domain,Subdomain和Scheme存储在他们自己的字段中,以便我可以索引它们并搜索它们。我的系统在数百万行上进行LIKE查询的速度太慢了。

  • 域名:site.com,site2.com
  • 子域名:www,''
  • 方案:http,https

如何创建MySQL触发器来执行此操作?每次更新时,都需要从URL字段中提取Domain,Subdomain和Scheme,然后将它们存储在各自的字段中(例如domainsubdomainscheme)这些字段只能由MySQL触发器写入。

我意识到解析URL往往是非常重要的,所以我最关心的是设置一个触发器来做这样的事情。我可以在我的应用程序中对URL解析的质量进行调整和权衡。

1 个答案:

答案 0 :(得分:1)

DELIMITER //

DROP TRIGGER IF EXISTS url_trigger_before_insert //

CREATE TRIGGER url_trigger_before_insert
 BEFORE INSERT ON url_table
 FOR EACH ROW 
 BEGIN
     DECLARE no_proto CHAR;
     SET NEW.scheme = SUBSTRING_INDEX(NEW.url, ':', 1);

     SET @no_proto = REPLACE(NEW.url,CONCAT(NEW.scheme,'://'),'');

     SET @no_proto = SUBSTRING_INDEX(@no_proto, '/', 1); 

     SET NEW.subdomain = SUBSTRING_INDEX(@no_proto, '.', 1);
     SET NEW.host = SUBSTRING_INDEX(@no_proto, '.', -2);

 END //

DROP TRIGGER IF EXISTS url_trigger_before_update //

CREATE TRIGGER url_trigger_before_update
 BEFORE UPDATE ON url_table
 FOR EACH ROW 
 BEGIN
     DECLARE no_proto CHAR;
     SET NEW.scheme = SUBSTRING_INDEX(NEW.url, ':', 1);

     SET @no_proto = REPLACE(NEW.url,CONCAT(NEW.scheme,'://'),'');

     SET @no_proto = SUBSTRING_INDEX(@no_proto, '/', 1); 

     SET NEW.subdomain = SUBSTRING_INDEX(@no_proto, '.', 1);
     SET NEW.host = SUBSTRING_INDEX(@no_proto, '.', -2);

 END //


DELIMITER ;