2017-02-03 3 views
0

Ich habe zwei Tabellen, die ich will Domain und Links mit 1k Reihen verbinden und mit 700k Reihen jeweilsJoin MySQL-Tabellen basieren auf Teil Spiel von Strings

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

Der Ausgang auf teilweise Übereinstimmung von ALL verbunden werden soll Domain.url Strings in Links.LongURL und das Ergebnis sollte zurückkehren 700k Zeilen aus der Links Tabelle und wo keine Übereinstimmung gefunden werden sollte null

versucht, die folgenden von diesem thread und 0 gefunden

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

Antwort

1

Das wird ein zeitaufwendiger Vorgang sein. Ihre Anfrage ist auf dem richtigen Weg, aber die richtige Syntax:

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

Das heißt, mit zwei Tabellen, diese Abfrage eine Weile dauern wird. Es muss etwa 700.000.000 Vergleiche mit like machen. Es gibt keine einfache Möglichkeit, die Abfrage zu beschleunigen.

+1

Angesichts der "keine Übereinstimmung gefunden sollte Null zurückgeben" Sie wahrscheinlich eine linke Verknüpfung. –

1

Um alle Links unabhängig davon, ob es eine übereinstimmende Domain gibt, können Sie LEFT OUTER JOIN verwenden.

Um sicherzustellen, dass jede Links Zeile nur einmal zurückgegeben wird, sollten Sie die Links Spalten GROUP BY und zurück nur ein Domain falls es für eine gegebene Links Reihe mehrere Domain Matches sind (eine Aggregatfunktion wie MIN() oder MAX() verwenden).

Etwas wie folgt aus:

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 

Ihre bestehende LIKE Aussage wird sehr langsam sein, und kann nicht von einem Index auf Links.LongURL profitieren. Wie speichern Sie die URLs und Domains? Wenn sie ein einheitliches Präfix, zum Beispiel haben alle Links.LongURL und Domain.url Werte beginnen mit https://, dann könnten Sie einen Index für Links.LongURL hinzufügen, loszuwerden, die führende Wildcard und machen die Abfrage viel schneller, wie folgt aus:

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

Wenn der DOMAIN-Name jedes Mal am Anfang der Zeichenfolge beginnt, können Sie so beschleunigen. als kann MySQL einen INDEX verwenden:

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