Ich habe 3 Tabellen Companymaster (davon 3 Millionen Zeilen hat), Token1, Token2 und die Tabellenstruktur ist,MYSQL - JOIN mit OR-Bedingung
Company
CREATE TABLE `CompanyMaster` (
`CompanyUID` int(11) NOT NULL AUTO_INCREMENT,
`WebDomain` varchar(150) DEFAULT NULL,
`CompanyPrimaryName` varchar(200) DEFAULT NULL,
PRIMARY KEY (`CompanyUID`)
) ENGINE=InnoDB AUTO_INCREMENT=3941244 DEFAULT CHARSET=latin1
Token1
Token2
CREATE TABLE `Token2` (
`CompanyUID` int(11) NOT NULL,
`Token` varchar(100) NOT NULL,
KEY `Token` (`Token`),
KEY `CompanyUID` (`CompanyUID`),
CONSTRAINT `CompanyAlias5_ibfk_1` FOREIGN KEY (`CompanyUID`) REFERENCES `CompanyMaster` (`CompanyUID`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
Ich möchte die WebDomain aus der Tabelle CompanyMaster mithilfe der Tabellen Token1 und Token2 abrufen.
Der Query ich verwende heißt,
SELECT WebDomain FROM CompanyMaster WHERE CompanyUID IN (
SELECT CompanyUID FROM Token1 WHERE Token='appleinc'
UNION
SELECT CompanyUID FROM Token2 WHERE Token='d012233:q122100:')
Diese Abfrage fast 30 Sekunden dauert das Ergebnis zu erhalten. Ich habe die Sub-Abfrage allein ausgeführt, die < 100 Millisekunden dauert. So ist das Problem mit der IN-Bedingung.
ich die Abfrage mit Join ersetzt und es wird in < 200 ms,
SELECT c.CompanyUID FROM `CompanyMaster` c
JOIN `Token1` tk1
ON tk1.CompanyUID = c.CompanyUID AND tk1.Token= 'appleinc'
JOIN `Token2` tk2
ON tk2.CompanyUID = c.CompanyUID AND tk2.Token= 'd012233:q122100:'
Aber das Problem mit obiger Abfrage ausgeführt wird, wenn tk1.Alias = 'appleinc' oder tk2.Alias = ‚d012233: q122100: 'schlägt fehl, es gibt Ausgabe als leere Zeile. Aber ich möchte die übereinstimmenden Zeilen auch wenn nur eine Bedingung übereinstimmt.
Bitte helfen Sie mir, dieses zu lösen? Und ich möchte auch, dass die Abfrage in weniger als 10 Millisekunden ausgeführt wird. Ist es erreichbar?
Hat eine der Antworten Ihren Anforderungen entsprochen? Könnten Sie einen Kommentar hinterlassen? – trincot