Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL] Optymalizacja zapytania
evolucja
post
Post #1





Grupa: Zarejestrowani
Postów: 362
Pomógł: 27
Dołączył: 14.09.2009

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


W jaki sposób mogę zoptymalizować to zapytanie? Obecnie wykonuje się koło 50 sekund, natomiast po usunięciu 3 JOINa jest to kwestia niecałej sekundy.
  1. SELECT * FROM `clientgroupassign`
  2. LEFT JOIN `clients` ON `clientgroupassign`.clientId = `clients`.clientId
  3. LEFT JOIN `users` ON `carerId` = `userId`
  4. LEFT JOIN
  5. (SELECT * FROM
  6. (SELECT * FROM `contacts` WHERE `contactGroup` = 4 ORDER BY `contactId` DESC)
  7. AS `contacts`
  8. GROUP BY (`contactClientId`)
  9. ) AS `contacts` ON `contactClientId` = `clients`.clientId
  10. WHERE groupId = 4
  11. ORDER BY `clients`.clientId


--------------------
zmoderowano - waga i rozmiar
Go to the top of the page
+Quote Post
-basel-
post
Post #2





Goście







Ostatni LEFT JOIN zmień na RIGHT JOIN dla próby.
Go to the top of the page
+Quote Post
evolucja
post
Post #3





Grupa: Zarejestrowani
Postów: 362
Pomógł: 27
Dołączył: 14.09.2009

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


Bez zmian. Nawet samo wywołanie:
"SELECT * FROM (SELECT * FROM `contacts` WHERE `contactGroup` = 4 ORDER BY `contactId` DESC)
AS `contacts`
GROUP BY (`contactClientId`)"
wszystko zawiesza i wykonuje się w nieskończoność..

W tym zapytaniu chcę pobrać 1 ostatni rekord z tabeli `contacts` dla każdego klienta będącego w grupie 4(bo klient może być w kilku grupach).

Ten post edytował evolucja 16.09.2013, 15:52:02


--------------------
zmoderowano - waga i rozmiar
Go to the top of the page
+Quote Post
-arrtxp-
post
Post #4





Goście







Rozbić na 2 zapytania ? Dodać indeksy ?

Ten post edytował arrtxp 16.09.2013, 15:50:44
Go to the top of the page
+Quote Post
evolucja
post
Post #5





Grupa: Zarejestrowani
Postów: 362
Pomógł: 27
Dołączył: 14.09.2009

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


Indeksy są, w tabeli kontakt wyglądają tak:

  1. Nazwa klucza Typ Jednoznaczny Spakowany Kolumna Moc Metoda porównywania napisów Null Komentarz
  2. PRIMARY BTREE Tak Nie contactId 30653 A
  3. contactClientId BTREE Nie Nie contactClientId 30653 A
  4. contactGroup 30653 A


Jak rozbić na dwa zapytania?


--------------------
zmoderowano - waga i rozmiar
Go to the top of the page
+Quote Post
-arrtxp-
post
Post #6





Goście







Przedstaw całą strukture tabel, bo te całe Twoje zapytanie do dupy jest niepodobne. Lub opisz co chcesz osiągnąć.
Go to the top of the page
+Quote Post
Damonsson
post
Post #7





Grupa: Zarejestrowani
Postów: 2 355
Pomógł: 533
Dołączył: 15.01.2010
Skąd: Bydgoszcz

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


Cytat(evolucja @ 16.09.2013, 15:16:50 ) *
po usunięciu 3 JOINa jest to kwestia niecałej sekundy.

Dziwi Cię to? wink.gif

Do czego Ci te selecty w selectach?
Go to the top of the page
+Quote Post
phpion
post
Post #8





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Proponuję denormalizację poprzez dodanie osobnej kolumny, która będzie przechowywała ID ostatniego kontaktu. Zachowanie poprawności danych osiągniesz poprzez triggery.
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 19.08.2025 - 10:20