Leistungsprobleme mit abgeleiteter Tabelle in SQL
-
24-10-2019 - |
Frage
Ich habe Probleme, eine abgeleitete Tabelle in MySQL zu verwenden. Verlangsamt die Verwendung einer abgeleiteten Tabelle die Verarbeitung einer Abfrage von Natur aus?
Hier ist die Frage, die ich versuche zu rennen. Es wird nicht ausgeführt und nur ausfällt.
Es gelingt. Wirklich, ich habe das Problem bis zum letzten Join isoliert. Wenn ich die letzte Verbindung herausnehme, funktioniert es gut. Aber wenn ich den letzten Join zurück hinzufüge, weigert sich, auszuführen.
SELECT cr.COMMUNICATIONS_ID AS ANSWER_ID,
cr.CONSUMER_ID as VIEWER_ID,
cr.ACTION_LOG_ID,
nc.PARENT_COMMUNICATIONS_ID AS QUESTION_ID,
nc.SENDER_CONSUMER_ID AS REPLIER_ID,
ces.EXPERT_SCORE AS REPLIER_EXPERTISE,
cim.CONSUMER_INTEREST_EXPERT_ID AS DOMAIN
FROM (SELECT 234 AS CONSUMER_ID,
ACTION_LOG_ID,
COMMUNICATIONS_ID
FROM consumer_action_log
WHERE COMM_TYPE_ID=4) AS cr
JOIN network_communications AS nc ON
cr.COMMUNICATIONS_ID=nc.COMMUNICATIONS_ID
JOIN communication_interest_mapping AS cim ON
nc.PARENT_COMMUNICATIONS_ID=cim.COMMUNICATION_ID
JOIN consumer_expert_score AS ces ON
nc.SENDER_CONSUMER_ID=ces.CONSUMER_ID
AND cim.CONSUMER_INTEREST_EXPERT_ID=ces.CONSUMER_EXPERT_ID;
Lösung
Hoffe das hilft ... Hier ist einige MySQL Create Index -Anweisungen. Wenn Sie Indizes hinzufügen können, stellen Sie grundsätzlich sicher, dass ein Index jeder Ihrer Spalten abdeckt, die 2 oder mehr Tabellen verbinden.
CREATE INDEX idx_nc
ON network_communications(COMMUNICATIONS_ID);
CREATE INDEX idx_cim
ON communication_interest_mapping(COMMUNICATION_ID);
CREATE INDEX idx_ces
ON consumer_expert_score(CONSUMER_ID, CONSUMER_EXPERT_ID);
Abgeleitete Tabellen sind nicht von Natur aus schlecht, aber in diesem Fall (siehe unten) ziehen Sie alle Datensätze von Consumer_Action_Log, die eine comm_type_id von 4. haben, keine Verbindung zu den anderen Tabellen zurück. Das könnte die Ursache der SQL sein, die nie zurückkehrt.
SELECT cr.COMMUNICATIONS_ID,
cr.CONSUMER_ID,
cr.ACTION_LOG_ID,
nc.PARENT_COMMUNICATIONS_ID,
nc.SENDER_CONSUMER_ID,
ces.EXPERT_SCORE,
cim.CONSUMER_INTEREST_EXPERT_ID
FROM (SELECT 234 AS CONSUMER_ID,
ACTION_LOG_ID,
COMMUNICATIONS_ID
FROM consumer_action_log
WHERE COMM_TYPE_ID=4) AS cr
JOIN network_communications AS nc ON
cr.COMMUNICATIONS_ID=nc.COMMUNICATIONS_ID
JOIN communication_interest_mapping AS cim ON
nc.PARENT_COMMUNICATIONS_ID=cim.COMMUNICATION_ID
JOIN consumer_expert_score AS ces ON
nc.SENDER_CONSUMER_ID=ces.CONSUMER_ID
AND cim.CONSUMER_INTEREST_EXPERT_ID=ces.CONSUMER_EXPERT_ID;
Andere Tipps
Abgesehen von den Indizes, die in Ihren Suchtabellen vorhanden sind, wie in Anser von John ausgeführt, würde ich sicherstellen, dass Sie auch einen Index auf comm_type_ID in Ihrer Tabelle Consumer_Action_log haben.
Dann fügen Sie Ihrer Klausel ein Schlüsselwort hinzu ... Ich habe immer großartige Ergebnisse gesehen, wenn eine Abfrage gut organisiert ist, anstatt sich auf die Abfrage -Engine zu verlassen, um es optimieren zu können ...Sehen Sie hier eine andere Probe
SELECT STRAIGHT_JOIN
cr.COMMUNICATIONS_ID AS ANSWER_ID,
cr.CONSUMER_ID as VIEWER_ID,
etc... rest of your query...
Es könnte sein, dass der Optimierer versucht, andere Tabellen zu betrachten, um herauszufinden, was zu bekommen ist. Sehen Sie sich Kommentare in anderen Stackoverflow -Antwort an, auf den ich einen Link zur Verfügung gestellt habe.