• 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

Ultraszybki serwer VPS NVMe START
+1 głos
113 wizyt
pytanie zadane 13 września w SQL, bazy danych przez arek01996 Stary wyjadacz (11,740 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 przez adrian17 VIP (107,300 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 przez rafal612b Pasjonat (22,450 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 przez Tomek Sochacki Pasjonat (20,910 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ź 62 wizyt
pytanie zadane 25 maja w SQL, bazy danych przez Q_Nick Gaduła (4,240 p.)
0 głosów
1 odpowiedź 127 wizyt
0 głosów
1 odpowiedź 55 wizyt
pytanie zadane 14 maja w SQL, bazy danych przez Bartlomiej Bywalec (2,480 p.)

41,475 zapytań

80,496 odpowiedzi

159,288 komentarzy

19,795 pasjonatów

Przeglądających: 316
Pasjonatów: 22 Gości: 294

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.

...