• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Optymalizacja zapytania do Bazy Danych SQL

+1 głos
135 wizyt
pytanie zadane 13 września 2017 w SQL, bazy danych przez arek01996 Stary wyjadacz (11,850 p.)

Witam,

Posiadam bazę danych, która zbiera wyświetlenia filmu i wygląda mniej więcej w ten sposób

 

``ID      ``File_id ``IP                   ``user_id   `hit_time`

6143935 587 178.xxx.41.109 NULL 2017-09-13 14:13:37

 

Zapytanie polega na tym, że sprawdza czy ten komputer (z takim ip) wchodziło na dane video w ostatniej godzinie jeżeli nie to dodaje wyświetlenie i insertuje nowy rekord. Tzn robię select ograniczony do 1 wiersza i szukam od tyłu, aż znajdzie ponieważ jest 100% że kolejny rekord będzie z późniejszą datą niż poprzedni.

Problem polega na tym, że w ciągu dnia może nazbierać się nawet kilka milionów rekordów i zapytanie zajmuje zbyt dużo czasu przy takich ilościach, szczególnie jak wchodzi ktoś kto nie był wcześniej w bazie. SQL przeszukuje wszystkie wyniki. Rozwiązaniem byłoby ograniczenie wyświetlenia wyników z ostatnich 60 min, bo wyświetlenia są nabijane co 1H. Tylko że WHERE tutaj nie wystarczy bo WHERE przeszuka wszystkie wyniki i pokaże te które pasują bo skąd MySQL ma wiedzieć że rekordy są ustalone według daty (każdy kolejny rekord ma późniejszą datę). Zastanawiałem się na HEAVING ale przy użyciu HEAVING zapytanie wcale nie trwa krócej.

Mam nadzieję, że zrozumieliście mój problem i znajdzie się jakaś dobra duszyczka, która pomoże.

Ps. Mówiąc prościej chce żeby mysql szukał od tyłu i przestawał wtedy kiedy 'hit_time' jest mniejszy o godzinę od obecnej godziny.

komentarz 13 września 2017 przez adrian17 VIP (112,580 p.)

Tylko że WHERE tutaj nie wystarczy bo WHERE przeszuka wszystkie wyniki

Nie ma indeksu?

1 odpowiedź

0 głosów
odpowiedź 15 września 2017 przez rafal612b Pasjonat (24,900 p.)
1) IP trzymaj w bazie jako liczbę ! to przyśpieszy znacznie ;)

http://php.net/manual/en/function.ip2long.php

2) Zrób jeden indeks na kolumne IP oraz hit_time

Powinno śmigać o wiele lepiej ;) Ewentualnie pokaż wszystkie zapytania jakie wykonujesz.
1
komentarz 15 września 2017 przez Tomek Sochacki Nałogowiec (36,690 p.)
po uwagach kolegi rafal zrzuć poleceniem EXPLAIN co się właściwie dzieje w Twoim zapytaniu. Będziesz wtedy więcej wiedział na temat indeksów i orientacyjnej ilości analizowanych wyników (choć z tym to bywa różnie).

Podobne pytania

0 głosów
1 odpowiedź 67 wizyt
pytanie zadane 25 maja 2017 w SQL, bazy danych przez Q_Nick Gaduła (4,660 p.)
0 głosów
1 odpowiedź 73 wizyt
0 głosów
1 odpowiedź 255 wizyt
pytanie zadane 28 lipca 2017 w SQL, bazy danych przez Mateusz1223 Użytkownik (910 p.)
Porady nie od parady
Odznacz odpowiedź zieloną fajką, jeśli uważasz, że jest ona najlepsza ze wszystkich i umożliwiła ci rozwiązanie problemu.
Ciekawy innych porad? Odwiedź tę stronę!

45,721 zapytań

86,115 odpowiedzi

171,966 komentarzy

22,180 pasjonatów

Przeglądających: 324
Pasjonatów: 19 Gości: 305

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...