SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 08.01.2011 18:32:39

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Индекс на столбцах даты и времени

Ребят, подскажите какой тип поля лучше использовать для индексов - DATE или DATETIME? В случае с DATE мы имеем бОльшее количество записей в индексе, но меньшее количество самих значений, а в DATETIME наоборот... Возможно что-то неправильными словами называю, но суть вопроса вроде ясна, т.к. вполне логична))

Подскажите, с каким типом поля выборка будет работать быстрее? Искать нужно как за несколько дат, так и начиная с конкретной даты/времени.

ЗЫ Помимо индексированного поля есть ещё поле DATETIME без индекса. Оба поля пока нужны, но при следующей реструктуризации одно поле уберём smile

Отредактированно Neval (08.01.2011 18:33:51)


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#2 09.01.2011 02:56:52

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Индекс на столбцах даты и времени

Вы еще забыли написать, *какая* выборка будет работать быстрее wink
Например, вот для этих двух выборок я бы выбрал разные варианты ответа на
Ваш вопрос:
SELECT ... FROM tablename WHERE `date` BETWEEN '2011-01-01' AND '2011-01-02';
SELECT ... FROM tablename WHERE `date` IN ('2011-01-01', '2011-01-02') AND otherfield > 7;

Неактивен

 

#3 09.01.2011 13:55:47

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Индекс на столбцах даты и времени

Эммм... вообще-то нужны обе))


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#4 09.01.2011 14:02:16

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Индекс на столбцах даты и времени

т.е. получается, с WHERE `date` BETWEEN '2011-01-01' AND '2011-01-02' будет быстрее выбирать при типе DATETIME...

Но если нужны обе выборки, есть ли какой-то компромисс по ускорению обоих одним индексом? smile Или как лучше сделать в данном случае?

ЗЫ В таблице сейчас 35кк записей, на каждую дату приходится по 100-700к записей, которые добавляются ежедневно, запросы такие обрабатываются не быстро smile

Отредактированно Neval (09.01.2011 14:02:56)


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#5 10.01.2011 16:40:43

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Индекс на столбцах даты и времени

Всё потому, что Вы пытаетесь идти от оптимизации. А надо идти от смысла. Что Вам
нужно хранить? Нужно ли Вам время? Если да — бывают ли запросы, которые ищут
«от 11 ночи вчера до 9 утра послезавтра», или они все по датам? Может, Вам вообще
не нужно время никогда? wink

Неактивен

 

#6 11.01.2011 00:49:08

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Индекс на столбцах даты и времени

Скажем так, в основном нужен поиск по датам "от и до" (как правило, указывается промежуток, а не конкретные выборочные даты), но бывают моменты, когда ищутся записи с конкретного времени, в таких случаях время указывается для уточнения и уменьшения количества результирующего множества.

А хранить время нам нужно smile

Отредактированно Neval (11.01.2011 00:49:34)


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#7 11.01.2011 21:26:49

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Индекс на столбцах даты и времени

Тогда я бы хранил отдельно DATE, отдельно TIME, чтобы по DATE можно было делать IN(),
и потом можно было использовать хвостик ключа. А TIME-запросы будут промахиваться
сильно по индексу, но тут уж ничего не поделаешь.

Неактивен

 

#8 11.01.2011 21:27:19

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Индекс на столбцах даты и времени

Впрочем, туплю. Все равно IN даст RANGE. Так что TIMESTAMP smile

Неактивен

 

#9 12.01.2011 13:06:03

Neval
Гуру
Откуда: Киев
Зарегистрирован: 11.03.2008
Сообщений: 449

Re: Индекс на столбцах даты и времени

Были мысли касательно разделения даты и времени, но грабли в том, что понятия здесь разные, поле added хранит дату добавления записи, а поле sended - дату и время фактической обработки записи, так-что получается, даты могут отличаться smile

Т.е. хотите сказать, что при IN (при подряд идущих значениях) оптимизатор будет действовать так же, как и при BETWEEN? smile


Человек без чувства юмора - не серьёзный человек wink

Неактивен

 

#10 12.01.2011 21:22:20

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Индекс на столбцах даты и времени

Уху.

Неактивен

 

#11 17.01.2011 21:02:47

TK
Участник
Зарегистрирован: 17.01.2011
Сообщений: 7

Re: Индекс на столбцах даты и времени

хмм, а я вот прогаммеров "гоняю", если они TIMESTAMP используют вместо int unsig. 8 байт против 4 у int unsig. имхо лучше мускуль не грузить тем, что можно вынести в приложение.
хотя если время выполнения запросов в данном случае будет более 500мс, то можно и не экономить.

Неактивен

 

#12 18.01.2011 02:18:07

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Индекс на столбцах даты и времени

Открою Вам страшную тайну — TIMESTAMP 4 байта в MySQL, даже в 64-битных ОС.
Да, проблема 2038 актуальна sad

Неактивен

 

#13 18.01.2011 07:19:31

TK
Участник
Зарегистрирован: 17.01.2011
Сообщений: 7

Re: Индекс на столбцах даты и времени

ой, выше видел datetime и все перепуталось. не пинайте сильно.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson