czwartek, 8 kwietnia 2010

Wolne działanie tabeli MySQL

Nie jestem specjalistą od baz danych, więc pewnie dlatego pojawił mi się dzisiaj dziwny problem z tabelą w bazie, której przeglądnięcie pomimo niewielkiej liczby rekordów (200 z hakiem) trwało wieki.
Co się okazuje? MySQL podczas kasowania danych w tabeli nie usuwa ich fizycznie, tylko nadpisuje jakimiś swoimi zerami, nullami, czy czymś podobnym ;)
NIe będę się tutaj rozpisywał, bo nie o to chodzi, ale dane typu tekstowego są przechowywane jako listy linkowane, więc 'pełne' usuwanie byłoby długie, ale za to przez taki śmietnik wyszukiwanie robi się dłuższe, bo wskaźnik chodzi po pustych rekordach. Informację o tym śmietniku MySQL pokazuje nam jako: NADMIAR. Tabela, która mi się zamuliła jest częścią systemu mailingowego i służy jako bufor, wszystkie maile są wrzucane do niej, a skrypt działający w tle sobie je wyciąga, wysyła i po wysłaniu kasuje. W ten sposób zostaje dużo nadmiaru (w moim przypadku ponad 1 MB, czyli sporo jak na tekst). Rozwiązanie okazuje się banalne i oto ono:

OPTIMIZE TABLE nazwa_tabeli

PO wykonaniu takiego zapytania wszystko zaczęło śmigać jak należy ;)
Proste, ale jeszcze wczoraj o tym nie wiedziałem - warto zaszyć taką optymalizację w swoich systemach, żeby jakoś okazjonalnie się wykonywała, co może nam czasem oszczędzić kłopotów ;)

AHA ODPOWIEDNIKIEM OPTIMIZE W PostgreSQL JEST VACUUM :)

2 komentarze:

  1. A co w takim przypadku: The storage engine for the table doesn't support optimize ?

    OdpowiedzUsuń

Masz uwagę, sugestię, albo po prostu ochotę - zostaw komentarz