Ich habe Abfragen wie unten (für dasselbe Ergebnis beabsichtigt) und ich möchte die Abfrage optimieren, so dass es die CPU-Auslastung des Datenbankservers reduziert.Wie verbessert man die SQL-Abfrage?
Ich habe zwei verschiedene Abfragen unten ausprobiert und es scheint, dass zwei Abfragen ähnliche Leistung haben. (überprüft mit SHOW PROFILES
)
Jeder Rat oder Vorschlag wäre willkommen.
Vielen Dank im Voraus.
Information:
Table A has 7333 rows
Table B has 5656 rows
Table C has 1108 rows
Table D has ~150 rows (keep changing)
Table E has 18576 rows
Query1:
SELECT A.ct, A.res, A.ctype, A.cweight, B.lat, B.lng, C.first, C.second, C.third
FROM A
JOIN B
ON A.ct= B.dct
JOIN C
ON A.ct = C.dct
LEFT JOIN
(
SELECT D.dct
FROM D
JOIN E
ON D.oct = E.oct
WHERE E.oct is null
OR (E.oct is not null
AND E.wua <> '')
) as K
ON A.ct = K.dct
WHERE A.type = 1 AND B.lng != '' AND B.lat != '' AND A.black != 1 AND B.modi_time > (NOW() + INTERVAL 8 HOUR)
ORDER BY A.ct DESC
Query2:
SELECT A.ct, A.res, A.ctype, A.cweight, B.lat, B.lng, C.first, C.second, C.third
FROM A
JOIN B
ON A.ct = B.ct
JOIN C
ON A.ct = C.dct
WHERE A.type = 1 AND B.lng != '' AND B.lat != '' AND A.black != 1 AND B.modi_time > (NOW() + INTERVAL 8 HOUR)
AND A.ct NOT IN (
SELECT D.dct
FROM D
JOIN E
ON D.oct = E.oct
WHERE E.wua <> ''
)
ORDER BY A.ct DESC;
Die erste Abfrage - das Problem könnte die OR-Bedingung sein. Die zweite Frage - ich würde NOT IN mit NOT EXISTS revirite. Natürlich müssen Sie Indizes (e.wua) und Ausführungspläne überprüfen. –
Verwenden Sie UNION anstelle von OR. NICHT IN sollte vermieden werden. – money
Indizierung sollte auf allen gleichwertigen Feldern und nur auf indizierten Feldern erfolgen, Gleichstellung sollte da sein, sonst wird es nur mit Tabellenscan enden. –