• 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

VPS Starter Arubacloud
+1 głos
375 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,100 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ź 310 wizyt
pytanie zadane 25 maja 2017 w SQL, bazy danych przez Q_Nick Mądrala (5,010 p.)
0 głosów
1 odpowiedź 292 wizyt
pytanie zadane 6 czerwca 2019 w PHP przez Jayix Użytkownik (680 p.)
0 głosów
1 odpowiedź 335 wizyt
pytanie zadane 10 maja 2022 w SQL, bazy danych przez alpha.netrunner Gaduła (4,690 p.)

92,454 zapytań

141,263 odpowiedzi

319,099 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...