![]() |
![]() ![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 2 707 Pomógł: 290 Dołączył: 16.12.2008 Skąd: Śląsk Ostrzeżenie: (0%) ![]() ![]() |
Posiadam bardzo prostą bazę w postaci ID (INT) i Data UNIX(INT).
Tabela $arr służy do generowania wykresu. Niestety wierszy jest sporo (miliony) i skrypt raczej się wywala. Samo zapytanie wg phpmyadmin to kilka setnych sekundy tak więc prawdopodobnie problemy są ze skryptem PHP. Próbowałem przerzucić działanie na bazę:
Ale znów sam skrypt w phpmyadmin wykonuje się ponad 10 sekund. Dodając do tego obróbkę w PHP to znów wywołanie skryptu jest na granicy możliwości. Jakieś sugestie? Ten post edytował markonix 24.11.2011, 16:03:29 |
|
|
![]()
Post
#2
|
|
Grupa: Zarejestrowani Postów: 248 Pomógł: 31 Dołączył: 14.12.2010 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
|
|
|
![]()
Post
#3
|
|
Grupa: Zarejestrowani Postów: 872 Pomógł: 94 Dołączył: 31.03.2010 Ostrzeżenie: (0%) ![]() ![]() |
Jezeli index nie pomoze to proponuje utworzyc jakas tabele/plik w ktorej/ym beda dane tylko i wylacznie do wykresow. Te dane powinny byc w postaci "tylko do odczytu", czyli w takim formacie, ktorego nie trzeba bedzie parsowac ani obrabiac w zaden posob. Taka tabela/plik powinna byc na bierzaco aktualizowana przez jakis skrypt w cronie ktoremu za bardzo nie zalezy na czasie.
Takie rozwiazanie sprawdzi sie jedynie w przypadku, w ktorym nie potrzeba sledzic wykresu na bierzaco i dozwolone sa opoznienia. Ten post edytował lukaskolista 24.11.2011, 10:31:33 |
|
|
![]()
Post
#4
|
|
Grupa: Zarejestrowani Postów: 2 707 Pomógł: 290 Dołączył: 16.12.2008 Skąd: Śląsk Ostrzeżenie: (0%) ![]() ![]() |
Indeksy były już nałożone - zapomniałem o tym wspomnieć.
lukaskolista pomysł jest w porządku tylko wykresów jest sporo. Aktualizacja wymagana jest nie na bieżąco ale tak np. co 15 minut. Puszczając to cronem to ok, nie ma to wpływu na usera ale szkoda mi troszkę serwera. Jeżeli danych będzie więcej to może to niekorzystnie wpłynąć na całą stronę dlatego chciałbym to zoptymalizować u źródła. To tylko dwie kolumny INT i myślałem, że nie będzie tak źle. Ostatecznie zmienię od drugiej strony - utworzę 3cią kolumną "date" (RRRR-MM-DD) i przerzucę odpowiedzialność na funkcje dodającą wiersze. Ten post edytował markonix 24.11.2011, 16:02:57 |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 262 Pomógł: 39 Dołączył: 12.04.2004 Ostrzeżenie: (0%) ![]() ![]() |
Pokaż strukturę tabeli, trochę przykładowych danych i definicje indeksów. Jeśli nie masz wiecej niż kilka milionów rekordów, to z odpowiednimi indeksami pierwsze zapytanie powinno być wystaczająco szybkie. Drugie jest marne - może jedynie wykorzystać indeks na aid. Ile rekordów zwraca baza przy pierwszym zapytaniu?
-- W zasadzie po chwili zastowienia stwierdzam, że powinieneś mieć osobną kolumnę z datą, czyli tak, jak napisałeś wcześniej. Pomogło? Ten post edytował Bags_Bunny 25.11.2011, 00:21:48 |
|
|
![]()
Post
#6
|
|
Grupa: Zarejestrowani Postów: 2 707 Pomógł: 290 Dołączył: 16.12.2008 Skąd: Śląsk Ostrzeżenie: (0%) ![]() ![]() |
~ Minimum 5 sekund. W każdym dniu do policzenia jest około 100 - 200 tysięcy wyświetleń. Troszkę mało rozwojowe te zapytanie (liczba wzrośnie i będzie znowu kiszka) ale na razie do zaakceptowania. Co ciekawe indeks nałożony na date pogarsza sytuację o 3 sekundy. Edit.. Usunięcie indeksu z `aid` skróciło do ~ 1 sekundy. Chyba czas przegruntować wiedzę o indeksach.. Ten post edytował markonix 25.11.2011, 00:52:12 |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 262 Pomógł: 39 Dołączył: 12.04.2004 Ostrzeżenie: (0%) ![]() ![]() |
Nic dziwnego. Indeks na jedną kolumnę powoduje pobieranie wielu przypadkowych rekordów = dodatkowe operacje dyskowe. Dodaj jeden indeks na aid i date; spróbuj też bez sortowania, choć nie powinno być ono problemem.
-- Zmieniłbym też * w count na coś zaindeksowanego - chociażby date. Nie wiem czy MySQL jest w stanie to z tą gwiażdką zoptymalizować. -- Poczytałem i wygląda na to, że count(*) jest jednak ok. Ten post edytował Bags_Bunny 25.11.2011, 01:08:53 |
|
|
![]()
Post
#8
|
|
Grupa: Zarejestrowani Postów: 2 707 Pomógł: 290 Dołączył: 16.12.2008 Skąd: Śląsk Ostrzeżenie: (0%) ![]() ![]() |
Podwójny indeks działa bardzo dobrze - czas wykonania poniżej 1 sekundy.
Grupowanie wg daty ułatwia także wyselekcjonowanie ostatnich 14dni, w których miały miejsce wejścia. Sortowanie jest konieczne, aby wybrać ostatnie 14 dni (potem tylko ksort to posortowania od najmniejszej daty). Ten post edytował markonix 29.11.2011, 14:47:07 |
|
|
![]() ![]() |
![]() |
Aktualny czas: 27.09.2025 - 02:31 |