2017-02-03 30 views
0

的部分比赛我有,我想加入 DomainLinks有1K行的两个表,并与70万行分别加入MySQL表基于字符串

create table Domain (url varchar(255), tag varchar(255)); 
create table Links (ShortURL varchar(255), LongURL varchar(255)); 

输出应该在所有的部分匹配来加入串Domain.urlLinks.LongURL发现和结果应该从Links表中返回700K行,在没有发现匹配的应该是null

想在这笔thread和0以下

回答

1

这将是一个耗时的操作。您所查询的是在正确的轨道上,但正确的语法是:

SELECT ShortURL, l.LongURL, tag 
FROM Links l LEFT JOIN 
    Domain d 
    ON l.LongURL LIKE concat('%', d.url, '%'); 

这就是说,你的两个表,这个查询是要需要一段时间。它需要使用like进行约700,000,000次比较。没有简单的方法来加快查询。

+1

鉴于“找不到匹配项应返回null”,您可能需要左连接。 –

1

无论是否有匹配的Domain,您都可以使用LEFT OUTER JOIN来返回全部Links

为了确保只返回各一次Links行,你应该GROUP BYLinks列,只返回一个Domain(使用像MIN()MAX()聚合函数)的情况下,有一个给定Links行多Domain匹配。

事情是这样的:

select Links.ShortURL, Links.LongURL, min(Domain.tag) 
from Links 
    left outer join Domain on Links.LongURL like concat('%', Domain.url, '%') 
group by Links.ShortURL, Links.LongURL 

您现有LIKE声明将是非常缓慢的,并从指数Links.LongURL不能受益。你如何存储URL和域名?如果他们有一个一致的前缀,例如所有Links.LongURLDomain.url值与https://启动,那么你可以在Links.LongURL添加索引,摆脱了领先的通配符,使查询速度更快,就像这样:

select Links.ShortURL, Links.LongURL, min(Domain.tag) 
from Links 
    left outer join Domain on Links.LongURL like concat(Domain.url, '%') 
group by Links.ShortURL, Links.LongURL 
0

如果DOMAIN Name每次在字符串开始时启动,则可以像这样加速。比MySQL可以使用INDEX:

SELECT ShortURL,LongURL,tag 
FROM Links fulljoin Domain 
ON 
    Links.LongURL LIKE concat(Domain.url, '%') 
OR 
    Links.LongURL LIKE concat('www.',Domain.url, '%');