0

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

我需要将域、子域和方案存储在它们自己的字段中,以便我可以索引它们并搜索它们。我的系统对数百万行执行 LIKE 查询太慢了。

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

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

我意识到解析 URL 通常很重要,所以我最关心的是设置触发器来执行此类操作。我可以在我的应用程序中对 URL 解析的质量进行调整和权衡。

4

1 回答 1

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 ;
于 2013-07-15T19:28:46.647 回答