Хранение дат в MySQL: сравнение производительности между различными методами для даты - PullRequest
6 голосов
/ 28 марта 2011

Теперь у меня есть три варианта:

1-й -> четыре столбца (дата, месяц, год, день) => 28, 03, 2011, 1Я могу легко искать и изменять эти столбцы без дополнительного изучения дат mysql.

2nd -> один столбец даты (дд-мм-гггг) => 28-03-2011 Для этого требуется толькопроще управлять одним столбцом, поскольку для поиска по датам есть только один параметр WHERE.Но я не знаю, как я могу искать все записи, скажем, за определенный день.Скажем, все данные за все прошедшие понедельники или все данные за все 28-е число.

3-й -> два столбца (метка времени unix для текущей даты, дня) => 1827328721Теперь я могу хранить данные в виде метки времени и легко выполнять поиск и сравнение, просто получая дату, а затем превращая ее в метку времени Unix, а затем используя ее в sql.Для дня я могу использовать столбец дня.

Теперь вопросы :

  1. Чем отличается производительность между этими методами?
  2. Как будут строиться запросы на выборки, вставки и обновления для этих различных предлагаемых решений?
  3. Какой из них является лучшим на ваш взгляд и почему?

Пожалуйста, ответьте на все три вопроса полностью,Потому что я не могу найти эту информацию в другом месте, и я знаю, что переполнение стека имеет блестящих программистов, которые могут ответить на этот вопрос очень последовательно.Этот вопрос будет полезен не только новичку, как я, но и всем остальным новичкам, которые могут использовать его для справки.

Заранее благодарен сообществу переполнения стека.

Ответы [ 3 ]

5 голосов
/ 28 марта 2011

Как производительность отличается между этими методами?

Это сильно зависит от типа приложения, использующего базу данных.

Первый метод можно считать ненормализованным подходом, но это может быть хорошей идеей, если данные используются для приложения OLAP. Например, если вам часто нужно собирать массивные наборы данных для определенного дня месяца, тогда эта денормализация может быть оправдана ... в противном случае это будет просто пустой тратой памяти и излишне сложным.

То же самое с третьим вариантом ... это просто ненормализованное представление даты; это может быть оправдано при очень ограниченном использовании, но обычно это будет плохая идея.

- EDIT -

Под Денормализованным я имею в виду следующее ...

Допустим, у вас есть запись со следующими полями ...

Date       Day    Month    Year
3/28/2011  28     3        2011

И скажем, вам нужно изменить день с 28 на 29. В этом случае вам нужно обновить два поля: поле «Дата» и «День» ... вместо одного. Если вы всегда помните, чтобы обновить оба, то это не большая проблема. Но если вы этого не сделаете, со временем вы получите что-то вроде следующего.

Date       Day    Month    Year
3/28/2011  29     2        2009

Так какова фактическая дата? Храня информацию в одном месте, вы исключаете возможность несоответствия в данных.

- КОНЕЦ РЕДАКТИРОВАНИЯ -

Какой из них является лучшим на ваш взгляд и почему?

Если ваша база данных не используется для OLAP ... я бы посчитал второй вариант лучшим.

Каким будет запрос на выборки, вставки и обновления построен для этих разных предлагаемые решения?

Для предпочтительного второго варианта это тривиально.

- ВТОРОЕ РЕДАКТИРОВАНИЕ -

Вы можете передать дату в виде строки, и MySQL проанализирует ее в соответствии с. Формат даты: «ГГГГ-ММ-ДД ЧЧ: мм: СС», но вам не нужно указывать время, если вы не хотите его хранить.

INSERT INTO tablename (date) VALUES ('2011-3-28')

Или, если вы просто хотите добавить текущую дату ...

INSERT INTO tablename (date) VALUES (CURDATE() )

- КОНЕЦ РЕДАКТИРОВАНИЯ -

4 голосов
/ 28 марта 2011

Если вам нужно сохранить значения даты, тип date (или datetime) - ваш выбор.Mysql имеет множество функций datetime , которые помогают вам строить запросы.Например,

SELECT * FROM your_table
WHERE date_column < DATE(NOW()) AND DAYOFWEEK(date_column) = 2 

// все понедельники в прошлом

1 голос
/ 28 марта 2011
  1. Полезно только если вам это нужно части независимо, что является маловероятно.
  2. Date или Datetime являются родными, и вы можете сделать их индексом для ускорения.
  3. не хорошо, не родной для mysql. если вам нужно разрешение до секунд, используйте datetime.

Для получения дополнительной информации о работе с датой и датой и временем смотрите руководство.

...