Spróbuj podzielić istniejący SQL na dwie części i zobacz, jakie są czasy wykonania dla każdej z nich. Miejmy nadzieję, że dałoby to informację, która część jest odpowiedzialna za spowolnienie:
część 1:
SELECT table_1.id
FROM table_1
LEFT JOIN table_2
ON (table_1.id = table_2.id)
WHERE table_1.col_condition_1 = 0
AND table_1.col_condition_2 NOT IN (3, 4)
AND table_2.id is NULL
i część 2 (zwróć uwagę na sprzężenie wewnętrzne tutaj):
SELECT table_1.id
FROM table_1
JOIN table_2
ON (table_1.id = table_2.id)
WHERE table_1.col_condition_1 = 0
AND table_1.col_condition_2 NOT IN (3, 4)
AND table_1.date_col > table_2.date_col
Spodziewam się, że część 2 zajmie więcej czasu. Myślę, że w tym przypadku pomocny byłby indeks zarówno na table_1, jak i table_2 na date_coll.
Nie sądzę, aby indeks złożony w ogóle pomógł w wyborze.
To powiedziawszy, że trudno jest zdiagnozować, dlaczego te trzy warunki łącznie wpłynęłyby tak źle na wydajność. Wygląda na to, że ma to związek z dystrybucją danych. Nie jestem pewien co do mySql, ale w Oracle zbieranie statystyk na tych tabelach miałoby znaczenie.
Mam nadzieję, że to pomoże.