Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Optymalizacja zaawansowanego zapytania, zabija serwer - strona ładuje się 10 sekund
Natalka
post
Post #1





Grupa: Zarejestrowani
Postów: 59
Pomógł: 6
Dołączył: 28.10.2009
Skąd: że znowu...

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


Mam pewien problem z zapytaniem, które strasznie zamula mi stronę.


Na stronie chcę pobrać

Wszystkie obrazki z bazy danych które zostały polubione powyżej 3 razy.


Moje zapytanie wygląda tak:
Kod
SELECT * FROM obrazek WHERE id in (SELECT id_obrazek FROM loveit HAVING count(loveit.id) > 3 ) ORDER BY id desc LIMIT $ilosc



Tabela obrazek - zawiera listę wszystkich obrazków

pola w bazie
id - nr id obrazka


Tabela loveit - zawiera listę wszystkich osób które lubią obrazek

pola w bazie
id_obrazek - nr id obrazka


Wiem że problem jest dokładnie tutaj
Kod
WHERE id in (SELECT id_obrazek FROM loveit HAVING count(loveit.id) > 3 )


Bo gdy usunę tę cześć działa bez problemu.

Czy jest ktoś w stanie mi pomóc w jaki sposób mogę to zoptymalizować?

Ten post edytował Natalka 15.05.2011, 14:08:14
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
melkorm
post
Post #2





Grupa: Zarejestrowani
Postów: 1 366
Pomógł: 261
Dołączył: 23.09.2008
Skąd: Bydgoszcz

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


Załóż indeksy na : user_id ( w obu tabelkach ) , id_obrazek, datadodania i dodanydata (przy okazji powinnaś te dwa pola zmienić na int/timestamp/date/datetime, bo varchar jest tutaj nie na miejscu).

edit:
Cytat
A czy mógłby ktoś jeszcze podpowiedzieć co takiego źle robiłam? Czemu aż tak bardzo moje zapytanie zamulało stronę?


Ponieważ dla każdego rekordu który pobierałaś odbywało się zapytanie
  1. SELECT id_obrazek FROM loveit HAVING count(loveit.id) > 3

które przelatywało za każdym razem całą tabelkę loveit.

I ogólnie IN'y + (sub)COUNTY są obciążające, dla tego jeżeli jest taka możliwość trzeba używać JOIN'ów które są o niebo szybsze.


edit2:
Dlaczego te pola są typu TEXT ? Nie wystarczyłby varchar(255/500) ?
Cytat
`tytul` text NOT NULL,
`skad` text NOT NULL,
`obrazek` text NOT NULL,
`obrazekmini` text NOT NULL,
`plikURL` text NOT NULL,


Jeszcze a propo indeksów możesz założyć na pole typ.

Ten post edytował melkorm 15.05.2011, 14:30:39
Go to the top of the page
+Quote Post
Natalka
post
Post #3





Grupa: Zarejestrowani
Postów: 59
Pomógł: 6
Dołączył: 28.10.2009
Skąd: że znowu...

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


Cytat(melkorm @ 15.05.2011, 15:23:49 ) *
Załóż indeksy na : user_id ( w obu tabelkach ) , id_obrazek, datadodania i dodanydata (przy okazji powinnaś te dwa pola zmienić na int/timestamp/date/datetime, bo varchar jest tutaj nie na miejscu).



Hmm..
Głupio mi przyznać bo nigdy nie stosowałam indeksów prócz dla id.

O co w nich chodzi?
Muszę ustawić nazwę klucza (czy ona ma jakiś związek z zapytaniem?)

Czy indeksy przyśpieszają pobieranie danych? Mam też inny duży serwis w którym niestety nie korzystam z indeksów, mimo że działa sprawnie.
A najwyższa pora zmienić swoje przyzwyczajenia i nauczyć się robić coś lepiej (IMG:style_emoticons/default/smile.gif)

Bardzo dziękuje za pomoc,

Pola TEXT już zmienione (IMG:style_emoticons/default/smile.gif)
Go to the top of the page
+Quote Post

Posty w temacie


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: 5.10.2025 - 06:40