Paweł Rohde wrote:
Udało mi się wyczytać w manualu, że przy takim joinie where jest brany pod uwagę tylko dla lewej tablicy.
Nie bardzo rozumiem. Where jest brany z tej tablicy, której dotyczy.
Czyli w tym przypadku jest wykonany skan cash (~50k rekordów) i potem z customersview. Co daje w wyniku ponad 1200000 odczytów.
Odwróciłem to zapytanie: SELECT SUM(value) FROM customersview LEFT JOIN cash ON customersview.id = customerid WHERE deleted = 0 GROUP BY customerid HAVING SUM(value) < 0;
A zobacz co zrobi jak usuniesz słówko LEFT, jest ono tutaj zbędne. Kolejność tabel też nie powinna tutaj mieć znaczenia. Jeśli baza nie potrafi tego optymalnie wykonać to jest to błąd bazy (jej konfiguracji?).
Być może problemem jest tutaj widok. Ktoś już zgłaszał podobny problem, ale ten ktoś miał InnoDB. Sprawdź co baza zrobi jak zamienisz customersview na customers.