2009-04-18 2 views
0

Я работаю над базой данных MySQL, которая создаст список «Сегодня в» и отправит его подписчикам. Мне интересно, лучше ли использовать тип данных DATETIME в начальном и конечном полях или два имеют два столбца: startDate и startTime (с соответствующими типами данных). Моя первая мысль была использовать DATETIME, но это делает последующее использование системы немного неудобно, так как вы не можете больше не писать:Лучше использовать два столбца или DATETIME

SELECT * FROM event_list WHERE startAt='2009-04-20'; 

Вместо этого, лучше всего я нашел:

SELECT * FROM event_list WHERE startAt LIKE '2009-04-20%'; 

и Мне не нравится взлом или его потенциальное влияние на производительность.

ответ

6

Просто используйте функцию DATE().

SELECT * FROM event_list WHERE DATE(startAt) = '2009-04-20' 
+2

Использование функции в предложении WHERE делает вероятным, что оптимизатор не будет использовать какой-либо индекс в startAt. – dkretz

+0

Согласовано. В вопросе упоминается производительность, поэтому, вероятно, они хотят избежать сканирования таблицы! – NickZoic

2

вы можете попробовать Smf как этот

select * from event_list where date(startAt) = '2009-04-20 
+0

Использование функции в предложении WHERE делает вероятным, что оптимизатор не будет использовать какой-либо индекс в startAt. – dkretz

2

Как насчет лучшее из обоих миров - есть таблица, которая использует один столбец DATETIME и представление этой таблицы, которая дает вам как дату и поля времени.

create view vw_event_list 
    as select ..., date(startAt) as startDate, time(startAt) as startTime 

select * from vw_event_list where startDate = '2009-04-20' 
6

SELECT * FROM event_list WHERE startAt> = '2009-04-20' AND startAt < '2009-04-21'

Это будет использовать индекс startAt эффективно и обрабатывать граничные условия правильно , (Любое предложение WHERE, включающее функцию, не сможет использовать индекс, - он не знает, что результат выражения имеет тот же порядок, что и значения столбца.

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

+0

Проблема в том, что я хочу, чтобы иметь возможность быстро захватывать сегодняшние события, но затем сказать «Это один из них в 4 часа дня» – ehdv

+0

Итак, вы можете «ВЫБЕРИТЬ ВРЕМЯ (startAt), event_name FROM event_list WHERE startAt> =? AND startAt NickZoic

+0

PS: Должен быть «И» в запросе. – NickZoic

0

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

летнее время особенно плохо.

(DAMHIK)

+0

Учитывая, что все события его покрытия будут проходить в одном кампусе, это не должно быть проблемой – ehdv

2

Реальное рассмотрение между отдельными полями даты и времени или 1 поле даты и времени индексируется. Вы не хотите этого делать: выберите * из event_list, где date (startAt) = '2009-04-20' в поле datetime, потому что он не будет использовать индекс. MySQL будет преобразовывать данные startAt в дату, чтобы сравнить его, что означает, что он не может использовать индекс. Вы хотите сделать это: выбрать * из event_list где startAt МЕЖДУ «2009-04-20 00:00:00» И «2009-04-20 23:59:59»

Проблема с поля даты и времени заключается в том, что вы не можете использовать его составной индекс, так как значение довольно уникально. Например, составной индекс в событии startAt + не позволит вам искать по дате + событие, только datetime + event. Но если вы разделите данные между полями даты и времени, вы можете индексировать событие startDate + и эффективно выполнять поиск.

Это просто пример для обсуждения, вы, очевидно, можете индексировать событие + startAt, и это сработает. Но вы можете найти, что хотите искать/суммировать по дате плюс другое поле. Создание составного индекса для этих данных сделает его очень эффективным.

Смежные вопросы