• 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
76 wizyt
pytanie zadane 13 września w SQL, bazy danych przez arek01996 Stary wyjadacz (11,540 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 (104,520 p.)

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

Nie ma indeksu?

1 odpowiedź

0 głosów
odpowiedź 6 dni temu przez rafal612b Pasjonat (18,300 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 6 dni temu przez Tomek Sochacki Stary wyjadacz (14,660 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ź 59 wizyt
pytanie zadane 25 maja w SQL, bazy danych przez Q_Nick Gaduła (4,160 p.)
0 głosów
1 odpowiedź 61 wizyt
0 głosów
1 odpowiedź 45 wizyt
pytanie zadane 14 maja w SQL, bazy danych przez Bartlomiej Bywalec (2,160 p.)
Obowiązuje już zaktualizowany regulamin.

Czy wiesz, że nie musisz już odświeżać strony głównej?

Lista pytań i odpowiedzi aktualizuje się automatycznie!

38,563 zapytań

76,428 odpowiedzi

149,241 komentarzy

18,032 pasjonatów

Przeglądających: 171
Pasjonatów: 3 Gości: 168

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.

...