Usuwanie z bazy mysql rekordów starszych niż


(stanek.94) #1

Witam! Mam baze mysql i chciałbym w jakiś najlepiej automatyczny sposób ustawić żeby były usuwane rekordy które mają datę starsza niż miesiac.

Wiem jakim poleceniem usuwać to "Z palca" ale wchodzić codziennie do phpmyadmin i wprowadzać kwerendę mi się nie widzi...

Szukam w internecie ale nic nie mogę znaleźć, są do tego jakieś funkcje?


(hoobert) #2

robisz skrypt w PHP usuwający wpisy starsze niż miesiąc i skrypt okresowo uruchamiasz przy użyciu CRONa http://wortal.php.pl/phppl/Wortal/Artykuly/Pomysly-porady-sugestie-dobre-nawyki/Okresowe-uruchamianie-skryptow-php


(Konrad Kosowski) #3

nie rób tego. Zwłaszcza, jeżeli to tablica z indeksami. Jeśli baza zaczyna “chodzić wolno” rozważ jakiś rodzaj rotacji (tworzenie nowej tablicy o tej samej strukturze, import do bazy rekordów z jakiegoś zakresu, podmiana tablic). Jeśli coś już raz trafiło do bazy to powinno w niej zostać.


(ra-v) #4

I co z tego że tablica z indeksami? Dawno nie widziałem bez indeksów.

Rekordy usuwa się gdy są nie potrzebne, nigdzie nie są wykorzystywane - jedynie trzeba pamiętać o usunięciu zależności.

Szkoda marnować miejsca na serwerze na jakieś zbędne dane i czasu na pisanie skryptów robiących jakieś “podmiany”, które mogą narobić dodatkowego syfu, czy nawet wywalić niechcący wszystkie dane.


(Konrad Kosowski) #5

Ano to, że zdefragmentowane indeksy potrafią wielokrotnie (rząd wielkości - 100) wydłużyć kwerendę. Jest jedna okoliczność, w której powinno się usunąć coś z tablicy. Gdy tablica przechowuje dane osobowe, a ich właściciel tego zażąda.


(pain3hp) #6

Wiesz co to jest zasada komputer zombie? To jest idealne rozwiązanie. Robisz tak, że codziennie pierwsza osoba która wejdzie na stronę to wyczyści to co chcesz o ile czyszczenie trwa max 2sekundy to nie będzie to miało wpływu na irytację tej osoby i będziesz miał zautomtyzowany proces.

Więc ja bym sobie jako flagę, (że dzisiaj już czyszczenie było) zrobił sobie pole typu datetime, następnie gdzieś na początku aplikacji napisał funkcję która sprawdza czy DATE() z tego pola jest mniejsze od DATE() dzisiejszego, jeżeli tak to wtedy robisz czyszczenie a po skończeniu czyszczenia zmieniasz oczywiście datę na dzisiejszą po to aby następny użytkownik już tego nie robił.

Ewentualnie cykliczne zadanie (cron) ale ja bym unikał cronów kiedy się da.

Bardziej zaawansowanym sposobem i również skutecznym może być TRIGGER na bazie


(stanek.94) #7

Oo a ja sie właśnie już zacząłem wgłębiać w cron, dlaczego odradzasz? :slight_smile:


(pain3hp) #8

może nie odradzam, raczej nie widzę powodów aby tutaj używać crona


(Fnxnet) #9

Tu nie ma co używać crona. Wystarczy skorzystać z wbudowanej Eventów w MySQLu:

CREATE EVENT myevent

    ON SCHEDULE AT CURRENT_TIMESTAMP + INTERVAL 1 HOUR

    DO UPDATE myschema.mytable SET mycol = mycol + 1;

Zamiast UPDATE możesz użyć dowolnej instrukcji - również usuwania.