Cześć,

Zaprojektowałem tabele do quizzów:quizz_result and quizz. quizz ma klucz główny na ID a quizz_result klucz obcy QUIZZ_ID do ID quizzu.

Poniższe zapytanie bierze publiczne quizzy posortowane po dacie z dodatkowymi informacjami: czy bieżący użytkownik (683735) wypełnił quizz i czy wynik jest poprawny (>0) i ile osób wypełniło już ten quizz.

Zrobiłem więc prostego selecta z dwoma joinami:

[SQL] pobierz, plaintext
  1. SELECT
  2. a.*,
  3. COUNT(countt.QUIZZ_ID) SUMFILL
  4. FROM
  5. quizz a
  6. LEFT JOIN quizz_result countt
  7. ON countt.QUIZZ_ID = a.ID AND
  8. countt.QUIZZ_RESULT_ID > 0
  9. WHERE
  10. a.PUBLIC = 1
  11. GROUP BY
  12. countt.QUIZZ_ID
  13. ORDER BY
  14. DATE DESC
  15. LIMIT 0,10;
[SQL] pobierz, plaintext

I dodałem indeksy do kolumn:
Quizz:

[SQL] pobierz, plaintext
  1. ID, (ID, DATE), PUBLIC, (PUBLIC, DATE)
[SQL] pobierz, plaintext

i do quizz_result:

[SQL] pobierz, plaintext
  1. ID, (QUIZZ_ID, USER_ID), QUIZZ_ID, USER_ID, (QUIZZ_ID, QUIZZ_RESULT_ID), (QUIZZ_ID, QUIZZ_REZULT_ID, USER_ID)
[SQL] pobierz, plaintext

Ale ciągle zapytanie trwa długo: prawie sekundę. A mam tylko 30k wierszy w QUIZZ_RESULTS i 120 w QUIZZ

Kiedy robię EXPLAIN otrzymuję:

[SQL] pobierz, plaintext
  1. SELECT TYPE: simple, possible KEYS: IDX_PUBLIC,DATE, rows: 34 extra: USING WHERE; USING TEMPORARY; USING filesort
  2. SELECT TYPE: simple, possible KEYS: IDX_QUIZZ_USER,IDX_QUIZZ_RES_RES_QUIZ,IDX_USERID,I..., rows: 1, extra: nothing here
  3. SELECT TYPE: simple, possible KEYS: IDX_QUIZZ_USER,IDX_QUIZ_RES_RES_QUIZZ,ID_RESULT_ID, rows: 752, extra: USING INDEX
[SQL] pobierz, plaintext

Widze że to:

[SQL] pobierz, plaintext
  1. USING WHERE; USING TEMPORARY; USING filesort
[SQL] pobierz, plaintext

może sprawiać problemy albo 752 wierszy w ostatnim wierszu, ale co dalej zrobić?

Jak zoptymalizować to zapytanie?

Edit: skróciłem zapytanie do wersji która trwa tak samo długo. Może teraz będzie łatwiej.