Salut,
Am 2 tabele: log_session si log in postgresql. Cele 2 sunt legate prin FK. Tabela log a ajuns maricica si ca sa o pastrez intr-o marime controlabila la fiecare minut sterg logurile mai vechi de o ora. Cele 2 sunt cu delete cascade.
Dureaza aproximativ o secunda stergerea unei sesiuni cu tot cu logurile ei.
Cam ce as putea sa optimizez?
Cam asa arata un explain
Cât de mare e log_session ?
Nu e o idee bună să faci logurile la sesiuni așa. Se va duce prin tot log session-ul ca să caute ce intră-n interval.
Vezi cât durează să ștergi ceva direct cu un id.
Dacă vrei o bază de date pentru log-uri vezi redis, timescaledb, questdb, clickhouse…
Pai tabela cu log e cea mai grea. Ajunge si la 20GB. log session e micuta si are cateva zeci de MB.
Ai putea partitiona tabelul la fiecare zi din log și să rulezi where pe partitia pe zi la log.
E o problemă complicată, redu numărul de elemente prin care rulează where-ul.
Totuși logurile stocate doar o oră nu văd ce avantaje aduc. Folosește direct redis sau syslog pentru ceva de genul.
Logurile sunt mukt mai potrivite in formst fisier, cu log rotate activat. Ai un usecase mai deosebit de le vrei in baza de date? Retentia e suficient de mica incat sa pierzi lucruri importante.
O sa le scot din DB numai ca acum era foarte curios sa vad daca pot sa optimizez.
Acum am o problema cu loguri ca “sunt grele” , dar in mod sigur problema asta o sa apara in timp si pe alte tabele.
Am mai observat la query tau ca stergi cu subselect. Nu merge delete … from … where conditie_de_timp ?