Baza danych: timestamp czy int?

MySQL - logo

Nie lubię się powtarzać ale jednak: wiecie że nie lubię mówić o oczywistych oczywistościach a tym bardziej pisać ;P

Ale faktycznie, po wpisie Tomka o polach timestamp w MySQL zauważyłem, że nigdy nie poruszyłem tego tematu.

Dlatego na szybko podam Wam argumenty dlaczego lepiej korzystać w MySQL z pól int do zapisywania czasu niż timestamp lub datetime:

  • liczbą łatwiej operować, a cały świat uniksowy posługuje się znacznikiem czasu który jest liczbą
  • szybciej, bez dodatkowych nakładów odejmiemy czy dodamy dwie daty w postaci liczby
  • przy zmianie maszyny nie musimy się zastanawiać nad żadnymi formatami, lokalizacjami itp. int jest int-em dzięki temu o wiele łatwiej wyświetlić nam dowolną datę w oparciu o int

Bardziej techniczne:

  • int zajmuje mniej miejsca w bazie (4 bajty dla int, 8 bajtów dla datetime, 4 bajty dla timestamp; manual)
  • pobranie z bazy danych jest o wiele szybsze jeśli to pola liczbowe, niż czasowe (~5x szybsze niż timestamp; baza nie musi tyle myśleć)

Jeśli już zaczniemy korzystać z int, nie używajcie przypadkiem w zapytaniach funkcji dot. czasu bo są mało wydajne (np. UNIX_TIMESTAMP()).
Własne sprawdzanie tych „teorii” robiłem lata temu. Dla ciekawskich polecam chociażby benchmark jaki zrobił ntavares w 2009 roku.

Jeśli bardzo chcecie mieć już w bazie datę (np. spora część logiki jest w niej, a nie aplikacji) bardziej polecam typ datetime, który przy odczycie jest jakiś 2x szybszy od timestamp.