Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Zoptymalizowanie jednego zapytania
MarcinUser
post
Post #1





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 19.07.2010

Ostrzeżenie: (0%)
-----


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 :/

Ten post edytował MarcinUser 26.11.2012, 20:37:41
Go to the top of the page
+Quote Post
sazian
post
Post #2





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

Ostrzeżenie: (0%)
-----


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.  
Go to the top of the page
+Quote Post
MarcinUser
post
Post #3





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 19.07.2010

Ostrzeżenie: (0%)
-----


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.

Ten post edytował MarcinUser 26.11.2012, 21:37:07
Go to the top of the page
+Quote Post
sazian
post
Post #4





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/biggrin.gif)
na pewno trochę przyspieszysz nakładając indeksy na recipient_id i thread_id
Go to the top of the page
+Quote Post
MarcinUser
post
Post #5





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 19.07.2010

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post
sazian
post
Post #6





Grupa: Zarejestrowani
Postów: 1 045
Pomógł: 141
Dołączył: 19.09.2006
Skąd: B-tów

Ostrzeżenie: (0%)
-----


ehhh. nie skopiowałem wszystkiego (IMG:style_emoticons/default/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.  
Go to the top of the page
+Quote Post
MarcinUser
post
Post #7





Grupa: Zarejestrowani
Postów: 60
Pomógł: 0
Dołączył: 19.07.2010

Ostrzeżenie: (0%)
-----


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 (IMG:style_emoticons/default/biggrin.gif)

Ten post edytował MarcinUser 26.11.2012, 22:28:41
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 3.10.2025 - 23:21