Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Powolne zapytanie zliczające
Forum PHP.pl > Forum > Bazy danych > MySQL
lobopol
Mam 3 tablice:
article
-id
-title
-status 1/2 index

tag
-id
-name

article_tags
-id
-articleId index
-tagId index

I chcę wyciągnąć 30 najczęściej dodawanych tagów gdzie artykuł ma status 1
  1. SELECT t.name AS name, count(a_t.id) AS number
  2. FROM tags AS t LEFT JOIN article_tag AS a_t ON (a_t.tagId = t.id) LEFT JOIN article AS a ON (a.id = a_t.articleId)
  3. WHERE a.`status` = 1 GROUP BY t.id ORDER BY number DESC LIMIT 30

Ma ktoś może pomysł jak zoptymalizować to zapytanie? przy 30 000 artykułów o statusie 1 i 70 000 o statusie 2, 30 000 różnych tagów i 500 000 tysiącach wpisów w tabeli article_tags zapytanie trwa około 3.5 sekundy, co prawda wpada do cache na 15 minut, ale chciałbym je jakoś zoptymalizować.
luckyps
Probowales zmienic LEFT na INNER questionmark.gif
lobopol
Różnice rzędu milisekund raz na plus, raz na minus
6nom
Sprobuj najpierw zrobic zliczanie, a dopiero pozniej zlaczenie

Nie wiem, czy to dobrze napisalem:

  1. SELECT
  2. t.name AS name
  3. ,x.number AS number
  4. FROM
  5. (SELECT
  6. COUNT(a_t.id) AS number
  7. ,a_t.tagId
  8. FROM
  9. article_tag a_t
  10. INNER JOIN article a ON (a.id = a_t.articleId AND a.STATUS = 1)
  11. GROUP BY a_t.tagId
  12. ORDER BY number DESC LIMIT 30
  13. ) x
  14. INNER JOIN tags t ON (t.id = x.tagId)
lobopol
Uzysk już niezły około 50% szybsze zapytanie dziękuje.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.