2017-02-03 32 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, '%');