2013-07-15 20 views
0

我有一個MySQL MyISAM表,它在url字段中存儲URL。 URL始終只是方案,子域和主機(例如,http://www.site.comhttps://site2.edu)。使用Mysql觸發器分解URL字段並將其存儲在MyISAM表中

我需要將Domain,Subdomain和Scheme存儲在它們自己的字段中,這樣我可以爲它們編制索引並搜索它們。我的系統對數百萬行執行LIKE查詢速度太慢。

  • 域名:site.com,site2.com
  • 子域:WWW ''
  • 方案:HTTP,HTTPS

如何創建一個MySQL觸發器來做到這一點?每次更新時都需要從URL字段中提取域,子域和Scheme,然後將它們存儲在各自的字段中(例如,domain,subdomain,scheme)。這些字段只能由MySQL觸發器寫入。

我意識到解析URL往往是不平凡的,所以我最關心的是設置一個觸發器來做這樣的事情。我可以在我的應用程序中對URL解析的質量進行調整和折衷。

+0

首先,「* domain *」沒有明確定義。有沒有簡單的方法來確定「域」結束和子域/主機開始的地方(不僅僅是因爲它們是由所討論域的運營商所做的語義區分,並且與其他地區無法區分)......最常見的方法是使用Mozilla的[公共後綴列表](https://wiki.mozilla.org/Public_Suffix_List)來確定公有域名註冊的級別,然後假設其下的任何內容都是私有主機/子域名。但這並不簡單。 – eggyal

+0

爲什麼索引標籤? –

+0

如果您使用亞馬遜的RDS,請知道設置觸發器相當複雜(http://stackoverflow.com/questions/8919907/can-i-create-trigger-in-an-rds-db)。將這種行爲放在代碼中可能會更容易。 –

回答

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 ; 
+0

這會工作更新到'url'字段嗎? –

+0

您可以爲BEFORE UPDATE條件創建第二個觸發器。請參閱編輯。 – Drew

相關問題