• 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

Object Storage Arubacloud
+1 głos
376 wizyt
pytanie zadane 13 września 2017 w SQL, bazy danych przez arek01996 Stary wyjadacz (12,100 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 Ekspert (344,860 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 rafal.budzis Szeryf (85,260 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 Ekspert (227,510 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ź 322 wizyt
pytanie zadane 25 maja 2017 w SQL, bazy danych przez Q_Nick Mądrala (5,010 p.)
0 głosów
1 odpowiedź 295 wizyt
pytanie zadane 6 czerwca 2019 w PHP przez Jayix Użytkownik (680 p.)
0 głosów
1 odpowiedź 353 wizyt
pytanie zadane 10 maja 2022 w SQL, bazy danych przez alpha.netrunner Gaduła (4,690 p.)

92,556 zapytań

141,404 odpowiedzi

319,560 komentarzy

61,942 pasjonatów

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...