Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Porównanie daty, Różnica 1 sekundy zwiększa czas wykonywania
snapshot
post 24.05.2011, 18:01:41
Post #1





Grupa: Zarejestrowani
Postów: 96
Pomógł: 6
Dołączył: 22.08.2007
Skąd: Wrocław

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


Mam takie proste zapytanie, które wykonuje się około 0.015 sekundy:
  1. SELECT idsong, COUNT(idsong) plays
  2. FROM on_air
  3. WHERE idradio = 5 AND time >= '2011-05-22 02:20:06'
  4. GROUP BY idsong
  5. ORDER BY plays DESC, idsong ASC
  6. LIMIT 20

Jeżeli zmniejszę czas w warunku o 1 sekundę to zapytanie wykonywać się będzie... 1.5 sekundy. Jakieś pomysły, bo ja odpadam...?

EDIT:
Teraz granica wynosi 2011-05-22 9:22:07-2011-05-22 9:22:08 (baza jest cały czas się rozszerza)

Ten post edytował snapshot 24.05.2011, 18:26:10


--------------------
ZF developer
Go to the top of the page
+Quote Post
zbig
post 25.05.2011, 07:24:04
Post #2





Grupa: Zarejestrowani
Postów: 144
Pomógł: 30
Dołączył: 5.05.2007
Skąd: Mannheim

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


Witam !

Po pierwsze sprawdz czy masz zaindeksowane kolumny "idradio", "time", "idsong", "plays".
Proponuje wspolny index dla "idradio" i "time" i pojedynczy dla pozostalych kolumn.

Po drugie sprawdz ile masz rekordow w Tabeli. Jezeli jest to w granicach 100 000 no to nic sie nie dzieje, jazeli jest 1000 000 pomysl czy rzeczywiscie taka ilosc rekordow musisz w tabeli trzymac.

Po trzecie jezeli nie korzystasz z funkcji daty w DB, to zmien typ kolumny time ( dziwna nazwa kolumny - podobnie jak "day" czy "now" biggrin.gif ) na biginteger i trzymaj tam timestamp. Na pewno bedzie szybciej szukac

Pozdrawiam


--------------------
Flash Flex PHP JAVA RED5 http://www.easyweb24.net
Go to the top of the page
+Quote Post
snapshot
post 25.05.2011, 11:00:06
Post #3





Grupa: Zarejestrowani
Postów: 96
Pomógł: 6
Dołączył: 22.08.2007
Skąd: Wrocław

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


Mam index na idradio, time, idsong i łączony dla idradio i idsong. Plays jest aliasem z COUNT(idsong).

W tabeli jest około 650 000 rekordów, niestety nie mogę aktualnie jej zmniejszyć.

Z tego co widziałem na testach to int wcale nie jest szybszy przy porównywaniu dat od datetime.


--------------------
ZF developer
Go to the top of the page
+Quote Post
zbig
post 25.05.2011, 11:07:44
Post #4





Grupa: Zarejestrowani
Postów: 144
Pomógł: 30
Dołączył: 5.05.2007
Skąd: Mannheim

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


Witam !

Sorry, masz racje, bo nie zauwazylem ze "plays" jest aliasem.
Powiedz mi jedynie o ile poprawi sie wynik, jezeli wyrzucisz linie

Kod
ORDER BY plays DESC, idsong ASC


Pozdrawiam


--------------------
Flash Flex PHP JAVA RED5 http://www.easyweb24.net
Go to the top of the page
+Quote Post
snapshot
post 25.05.2011, 11:15:05
Post #5





Grupa: Zarejestrowani
Postów: 96
Pomógł: 6
Dołączył: 22.08.2007
Skąd: Wrocław

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


Jest różnica, ale głównie rozchodzi się o tą granicę w warunku, która powoduje tak dużą zmianę w wydajności.


--------------------
ZF developer
Go to the top of the page
+Quote Post
zbig
post 25.05.2011, 11:51:30
Post #6





Grupa: Zarejestrowani
Postów: 144
Pomógł: 30
Dołączył: 5.05.2007
Skąd: Mannheim

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


No i niestety tak juz bedzie, a to z jenego prostego powodu.
Zmiana granicy warunku zwieksza najwyrazniej w duzym stopniu ilosc znalezionych rekordow ktore wynikalyby z zapytania

Kod
SELECT count(*)
FROM on_air
WHERE idradio = 5 AND time >= '2011-05-22 02:20:06'


Wyobraz sobie ze jest to np. 200.000 rekordow.
Twoj limit 20 jest w tym przypadku tylko limitem wyswietlanych danych, a nie limitem dla zapytania.

A jasniej chodzi o to , ze przy warunku GROUP BY idsong MYSQL analizuje i grupuje w calym zbiorze znalezionych danych ( zalozmy 200.000 ), a nie w danych limitiwanych do 20.
Dodatkowo musi on posortowac caly zbior przez alias , ktory przybiera jakas wartosc dopiero po pogrupowaniu danych.
I dopiero po tych wszystkich happeningach wink.gif pokazuje pierwsze 20 wynikow.

W samym MYSQL sprawa jest dosc skomplikowana. W tego typu sytuacjach stosuje sie tzw "Faceted search", ale ma on niewiele wspolnego z MYSQL..
Z kolei w jezyku JAVA tego typu sytuacje mozna rozwiazac stosujac streamowanie wynikow i przniesienie dzieki temu czesci operacji obliczeniowych do warstwy logicznej. Pracujemy wtedy w trybie READ-ONLY , fetch-size ustawia sie na INTEGER_MIN_VAL i w ten sposob mozna bez narazania sie na OUT OF MEMORY przeprowadzic interesujaca Cie operacje w warswie logicznej ( oczywiscie tez w granicach zdrowego rozsadku ) .
Php niestety nie umie tego .... sad.gif

Pomysl o innym rozwiazaniu , szczegolnie ze Twoja baza , jak wspominales wciaz rosnie.
Moze JAVA LUCENE ? ... ( Tylko nie pokus sie na ZEND LUCENE - odradzam )

Albo bazujac tylko na MYSQL jakis Trigger, ktory bedzie budowal Ci na biezaca jakas tabele wynikowa z ktorej pobierzesz dane bez takich perwersji smile.gif.

Pozdrawiam

Ten post edytował zbig 25.05.2011, 11:54:41


--------------------
Flash Flex PHP JAVA RED5 http://www.easyweb24.net
Go to the top of the page
+Quote Post
melkorm
post 25.05.2011, 11:58:49
Post #7





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

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


Jakiego typu jest kolumna time? Możesz też spróbować zmienić na INT i operować na timestamp'ie.


--------------------
Go to the top of the page
+Quote Post
zbig
post 25.05.2011, 12:05:30
Post #8





Grupa: Zarejestrowani
Postów: 144
Pomógł: 30
Dołączył: 5.05.2007
Skąd: Mannheim

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


@melkorm
Cytat
Jakiego typu jest kolumna time? Możesz też spróbować zmienić na INT i operować na timestamp'ie.

@zbig
Cytat
Po trzecie jezeli nie korzystasz z funkcji daty w DB, to zmien typ kolumny time ( dziwna nazwa kolumny - podobnie jak "day" czy "now" ) na biginteger i trzymaj tam timestamp. Na pewno bedzie szybciej szukac


biggrin.gif

Pozdrawiam


--------------------
Flash Flex PHP JAVA RED5 http://www.easyweb24.net
Go to the top of the page
+Quote Post
melkorm
post 25.05.2011, 12:08:39
Post #9





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

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


ah, sorry, nie spałem dzisiaj i nie chciało mi się czytać wink.gif


--------------------
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 Wersja Lo-Fi Aktualny czas: 21.06.2025 - 15:29