2013-08-21 13 views
15

Generalnie korzystam z pola datetime do przechowywania created_time zaktualizowanego czasu danych w aplikacji.Datetime vs Data i czas Mysql

Ale teraz natknąłem się na tabelę bazy danych, w której przechowywane są data i czas oddzielnych pól w tabeli.

  1. Więc jaki jest schemat, w którym dwa z nich powinny być używane i dlaczego?
  2. Jakie są plusy i minusy związane z użyciem dwóch?
+1

Zastanawiam się nad przełączeniem na osobne pola daty i godziny.moja sytuacja jest taka, że ​​muszę mieć możliwość przechowywania czasu "TBD", kiedy znam datę. Obecnie używam 12AM jako wartości dla czasów "TBD", ale okazuje się, że jest to więcej kłopotów, niż bym chciał. Czy ktoś ma lepsze rozwiązanie dla czasów TBD? lub czy mój proponowany pracownik metody jest dla nich lepszy? –

Odpowiedz

23

Mam tendencję do myślenia, że ​​zasadniczo nie ma żadnych korzyści dla przechowywania daty i czasu w osobnych polach. MySQL oferuje bardzo wygodne funkcje do wyodrębniania części daty i czasu o wartości datetime.

OK. Mogą być pewne przyczyny związane z wydajnością. W MySQL możesz umieścić oddzielne indeksy na polach. Jeśli więc na przykład chcesz wyszukać konkretną razy, zapytanie liczone według godzin dnia (na przykład) może korzystać z indeksu w polu time. Indeks w polu datetime nie byłby w tym przypadku używany. Oddzielne pole date może ułatwić pisanie zapytania, które będzie korzystało z indeksu date, ale, ściśle rzecz biorąc, powinno również działać datetime.

Jednorazowe miejsce, w którym widywałem dat i godzin oddzielnie, znajduje się w systemie transakcyjnym. W tym przypadku transakcja ma datę wyceny. Czas wyceny jest podobny do "NY Open" lub "London Close" - nie jest to wartość w czasie rzeczywistym. Jest to opis pory dnia wykorzystywanej do wyceny.

1

Najtrudniejszą częścią jest wtedy, gdy musisz wykonać arytmetyczną datę na wartości czasu i nie chcesz, aby część daty wchodziła do miksu. Ex:

myapptdate = 2014-01-02 09:00:00

Wybierz takie i takie, gdzie myapptdate między 02.01.2014 a 02.01.2014 13:00:00 07:00:00

1900-01-02 07:00:00 2014-01-02 07:00:00

25

Istnieje ogromna różnica w wydajności przy użyciu pola daty powyżej pola daty. Mam tabelę z ponad 4.000.000 rekordów i do celów testowych dodałem 2 pola z własnym indeksem. Jeden używa DATETIME, a drugi - DATE.

I wyłączony cache zapytań MySQL, aby móc prawidłowo przetestować i zapętlony w tym samym zapytaniu do 1000x:

SELECT * FROM `logs` WHERE `dt` BETWEEN '2015-04-01' AND '2015-05-01' LIMIT 10000,10; DATETIME INDEX: 197,564 sekund.

SELECT * FROM `logs` WHERE `d` BETWEEN '2015-04-01' AND '2015-05-01' LIMIT 10000,10; DATA INDEX: 107.577 sekund.

Użycie pola indeksowanego z datą poprawia wydajność o: 45,55% !!

Powiedziałbym, że jeśli spodziewasz się dużej ilości danych w swojej tabeli, rozważ oddzielenie daty od czasu z własnym indeksem.