2017-05-05 3 views
1

Ich fügte eine OR-Bedingung zu einer Abfrage hinzu und die Ausführungszeit der Abfrage wird auf 15+ Sekunden von weniger als 0,5 Sekunden erreicht. Alle in where-Klausel verwendeten Spalten werden indiziert. Frage mich, wie kann ich diese Abfrage optimieren.Hinzufügen der OR-Bedingung zur Abfrage verlangsamt

SELECT SQL_NO_CACHE COUNT(DISTINCT wo.id) AS totrows 
FROM wo 

LEFT JOIN wu 
ON wu.id = wo.id 

LEFT JOIN bu 
ON bu.id = wu.id 

LEFT JOIN ub 
ON ub.uid = bu.id 

JOIN u 
ON u.id = wo.created_by 

LEFT JOIN ws 
ON ws.wo_id = wo.id, b 

WHERE (wo.bid = '13' 
AND (wo.created_by IN('2506') OR wo.uid IN('2506')) 
AND wo.status != 5 
AND (wo.uid = '' || wu.uid in ('406', 0) || wo.uid IS NULL) 
AND wo.ut = 0 
AND ((wo.wt = 'unit' AND (wo.archive != 1 OR wo.archive IS NULL)) OR wo.wt = 'common')) OR (ws.uid = 2506) 

Entfernen OR (ws.uid = 2506) macht Abfrage sehr schnell.

Antwort

0

Ich endete mit SELECT COUNT(*) FROM (Query1 union Query2) wie folgt. Sieht soweit gut aus.

SELECT COUNT(*) AS totrows FROM (
    SELECT SQL_NO_CACHE COUNT(DISTINCT wo.id) AS totrows 
    FROM wo 

    LEFT JOIN wu 
    ON wu.id = wo.id 

    LEFT JOIN bu 
    ON bu.id = wu.id 

    LEFT JOIN ub 
    ON ub.uid = bu.id 

    JOIN u 
    ON u.id = wo.created_by 

    LEFT JOIN ws 
    ON ws.wo_id = wo.id 

    WHERE (wo.bid = '13' 
    AND (wo.created_by IN('2506') OR wo.uid IN('2506')) 
    AND wo.status != 5 
    AND (wo.uid = '' || wu.uid in ('406', 0) || wo.uid IS NULL) 
    AND wo.ut = 0 
    AND ((wo.wt = 'unit' AND (wo.archive != 1 OR wo.archive IS NULL)) OR wo.wt = 'common')) OR (ws.uid = 2506) 

    UNION 

    select DISTINCT wo.id from wo LEFT JOIN ws ON ws.wo_id = wo.id WHERE ws.uid = 2506 

) AS T 
Verwandte Themen