我有一个MySQL MyISAM表,用于在url
字段中存储URL。 URL始终只是方案,子域和主机(例如http://www.site.com或https://site2.edu)。
我需要将Domain,Subdomain和Scheme存储在他们自己的字段中,以便我可以索引它们并搜索它们。我的系统在数百万行上进行LIKE查询的速度太慢了。
如何创建MySQL触发器来执行此操作?每次更新时,都需要从URL字段中提取Domain,Subdomain和Scheme,然后将它们存储在各自的字段中(例如domain
,subdomain
,scheme
)这些字段只能由MySQL触发器写入。
我意识到解析URL往往是非常重要的,所以我最关心的是设置一个触发器来做这样的事情。我可以在我的应用程序中对URL解析的质量进行调整和权衡。
答案 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 ;