2016-04-15 9 views
2

newlist - 20.000 DatenIst diese Inner Join-Anweisung korrekt?

record - 200.000 Daten

Ich möchte von newlist alle Spielaufzeichnung anzuzeigen

es record muss Spiel in VORNAME, Middle, ZUNAME

SELECT new.FIRSTNAME,new.MIDDLENAME,new.LASTNAME 
FROM newlist as new 
INNER JOIN recordlist as bgc ON new.FIRSTNAME = bgc.FIRSTNAME 
AND new.MIDDLENAME = bgc.MIDDLENAME AND new.LASTNAME = bgc.LASTNAME"; 
sein

ist diese Abfrage korrekt? um alle Spiele anzuzeigen?

+3

Die Abfrage ist korrekt, aber Ihre Logik wird alles mit dem gleichen Namen oder gleichen Vornamen oder gleichen Nachnamen übereinstimmen. Zum Beispiel würde "John Snow" mit "John Rain" übereinstimmen, weil Vorname gleich ist. Abhängig von Daten könnte dies zu einer Multiplikation von Übereinstimmungen führen. Um dies zu ändern, ändern Sie Ihr "ODER" in "UND". – Th0rndike

+0

warum nicht versuchen und sehen, ob es das erwartete Ergebnis – Jester

+0

zurückgibt das Problem ist es dauert Zeit zum Laden aufgrund der Rekordliste hat 200.000 Datensätze. –

Antwort

0

Sie indexierten die drei Spalten, die ich vermute? Wenn dies nicht so tun :)

Wenn sie bereits indiziert sind:

Mit mehreren OR ist, manchmal ist es besser, die Abfrage zu spalten und die Ergebnismengen mit einer Union beitreten. Dies zur Verwendung des Indexes.

SELECT new.FIRSTNAME,new.MIDDLENAME,new.LASTNAME 
FROM newlist as new 
INNER JOIN recordlist as bgc ON new.FIRSTNAME = bgc.FIRSTNAME 
UNION 
SELECT new.FIRSTNAME,new.MIDDLENAME,new.LASTNAME 
FROM newlist as new 
INNER JOIN recordlist as bgc ON new.MIDDLENAME = bgc.MIDDLENAME 
UNION 
SELECT new.FIRSTNAME,new.MIDDLENAME,new.LASTNAME 
FROM newlist as new 
INNER JOIN recordlist as bgc ON new.LASTNAME = bgc.LASTNAME" 
+0

Hm Ich bin mir ziemlich sicher, dass die Indizierung eines Vornamens eine schreckliche Idee ist, da zwei Personen den gleichen Vornamen haben können. –

+0

Indizierung bedeutet nicht, dass es ein UNIQUE-Index sein muss. Beispiel: Wenn Sie nach John Doe seine Telefonnummer suchen, fangen Sie an, nach allen Namen zu suchen, die mit einem 'D' beginnen, oder? Das verwendet einen Index. – Johan

+0

Oh Mann, du hast recht, verdammt, ich habe Arbeit mit meinen neuen Tischen zu tun! –

0

Sie haben nichts über Indizes erwähnt. Ich gehe davon aus, dass Sie sie nicht benutzen. Bei einem 200.000-langen Tisch muss man das grundsätzlich tun.

Das Hinzufügen der Indizes kann eine Weile dauern, aber Sie müssen es nur einmal pro Tabelle durchführen. Und wenn es bei der Tabellenerstellung gemacht wird, dauert es < 10ms.

die Indizes hinzuzufügen:

ALTER TABLE `new` ADD INDEX (FIRSTNAME, MIDDLENAME, LASTNAME); 
ALTER TABLE `bcg` ADD INDEX (FIRSTNAME, MIDDLENAME, LASTNAME); 

Dann können Sie die folgende Abfrage verwenden, um Ihre Sache zu tun:

SELECT 
    `new`.FIRSTNAME, 
    `new`.MIDDLENAME, 
    `new`.LASTNAME 
FROM newlist `new` 
    INNER JOIN recordlist `bgc` 
    ON `new`.FIRSTNAME = `bgc`.FIRSTNAME 
     AND `new`.MIDDLENAME = `bgc`.MIDDLENAME 
     AND `new`.LASTNAME = `bgc`.LASTNAME"; 
+0

Das ist die falsche Antwort –

+0

@VigneshKumar hmm, könnten Sie ein wenig hier ausarbeiten? –

+0

@kimdecastro könnten Sie einen Vergleich der Ausführungszeit der Antworten in diesem Beitrag veröffentlichen? Ich bin gespannt, welcher der Schnellste ist. –

0

Indizes 3 Spalten wird sehr schnell das Ergebnis angezeigt werden soll.

Es dauert 5 Sekunden, bis das Ergebnis angezeigt wird.

SELECT new.FIRSTNAME,new.MIDDLENAME,new.LASTNAME 
FROM newlist as new 
INNER JOIN recordlist as bgc ON new.FIRSTNAME = bgc.FIRSTNAME 
AND new.MIDDLENAME = bgc.MIDDLENAME AND new.LASTNAME = bgc.LASTNAME";