Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zoptymalizowanie jednego zapytania
Forum PHP.pl > Forum > Bazy danych > MySQL
MarcinUser
Witam,
Mam zainstalowaną pewną wtyczkę do Wordpressa (Mingle), jest tam pewna funkcja odpowiedzialna za pobieranie ilości prywatnych wiadomości w skrzynce. Niestety niekiedy zapytanie bardzo długie się wykonuje. Próbowałem poprawić zapytanie ale coś mi nie wychodzi... Dlatego proszę Was o pomoc.
Poniżej zapytania, mam nadzieję, że tyle wystarczy.

  1. "SELECT count(*)
  2. FROM wp_mngl_messages mpm
  3. WHERE mpm.id=( SELECT mpm2.id
  4. FROM wp_mngl_messages mpm2
  5. WHERE mpm2.thread_id=mpm.thread_id
  6. AND mpm2.recipient_id=3668
  7. ORDER BY mpm2.created_at DESC
  8. LIMIT 1 )
  9. ORDER BY mpm.created_at DESC


Myślałem żeby rozbić to na dwa zapytania, tylko nie mam pomysłu :/
sazian
a przypadkiem nie wystarczy tak
  1. SELECT count(*)
  2. FROM wp_mngl_messages mpm
  3. WHERE recipient_id=3668
  4. ORDER BY mpm.created_at DESC
  5.  
  6.  
MarcinUser
Niestety nie. W takim przypadku Count wyniesie 333 a w przypadku zapytania z pierwszego postu wynosi 5.
Tutaj pierwsze 4 wiersze z tabeli:

Kod
id    thread_id    author_id    recipient_id    body    unread    created_at
1     1             2811         2676             Treść1    0         2012-10-22 18:39:40
2     1             2811         2811             Treść1    0         2012-10-22 18:39:40
3     2             3394         3148             Treść2    0         2012-10-22 18:42:26
4     2             3394         3394             Treść2    0         2012-10-22 18:42:26


Warto zwrócić uwagę, że ta sama wiadomość pojawia się dwa razy w tabeli (dla nadawcy i odbiorcy). Stąd pewnie trzeba takie złożone zapytanie/a.
sazian
ok już wiem o co chodzi

  1. SELECT count(*)
  2. FROM (
  3. SELECT 1
  4. FROM wp_mngl_messages mpm
  5. WHERE recipient_id=3668
  6. GROUP BY thread_id
  7. )

tylko pytanie czy taki potworek na pewno będzie szybszy biggrin.gif
na pewno trochę przyspieszysz nakładając indeksy na recipient_id i thread_id
MarcinUser
Z racji, że jestem amatorem to i Select 1 nie jest mi specjalnie znany. W każdym bądź razie wywala bład: Every derived table must have its own alias
Ale zapytanie wygląda prościej więc może faktycznie będzie lepsze smile.gif
sazian
ehhh. nie skopiowałem wszystkiego biggrin.gif

  1. SELECT count(*)
  2. FROM (
  3. SELECT 1
  4. FROM wp_mngl_messages mpm
  5. WHERE recipient_id=3668
  6. GROUP BY thread_id
  7. ) t
  8.  
MarcinUser
Na razie wydaje się działać poprawnie. Problemem poprzedniego zapytania było to, że jakby się "zacinał" (i stało w kolejce). Tutaj na razie tego nie doświadczyłem. Bardzo dziękuję za pomoc biggrin.gif
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.