Является ли хорошей идеей индексировать поле datetime в mysql?

Я работаю над созданием большой базы данных. В моем приложении у меня будет много строк, например, у меня в настоящее время есть одна таблица с 4 миллионами записей. Большинство моих запросов используют предложение datetime для выбора данных. Является ли хорошей идеей индексировать поля datetime в базе данных mysql?

Select field1, field2,.....,field15
from table where field 20 between now() and now + 30 days 

Я стараюсь, чтобы моя база данных работала хорошо, и запросы выполнялись плавно

Больше, какая идея, по-вашему, мне нужно создать базу данных с высокой эффективностью?

Ответ 1

MySQL рекомендует использовать индексы по целому ряду причин, включая устранение строк между условиями: http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

Это делает ваш столбец datetime отличным кандидатом на индекс, если вы собираетесь использовать его в часто встречающихся в запросах условиях. Если ваше единственное условие BETWEEN NOW() AND DATE_ADD(NOW(), INTERVAL 30 DAY), и у вас нет другого индекса в этом состоянии, MySQL должен будет выполнить полное сканирование таблицы по каждому запросу. Я не уверен, сколько строк создается за 30 дней, но до тех пор, пока оно составляет менее 1/3 от всех строк, будет более эффективно использовать индекс в столбце.

Вопрос о создании эффективной базы данных очень широк. Я бы сказал, чтобы убедиться, что он нормализован, и все соответствующие столбцы индексируются (т.е. Используются в объединениях и где предложения).

Ответ 2

Здесь автор выполнил тесты, показал, что целочисленная временная метка unix лучше, чем DateTime. Заметьте, он использовал MySql. Но я чувствую, что какой-то механизм БД, который вы используете, сравнивая целые числа, немного быстрее, чем сравнение дат, поэтому индекс int лучше индекса DateTime. Take T1 - время сравнения 2 дат, T2 - время сравнения 2 целых чисел. Поиск по индексированному полю занимает приблизительно время O (log (rows)), потому что индекс основан на некотором сбалансированном дереве - он может быть другим для разных модулей БД, но в любом случае журнал (строки) является общей оценкой. (если вы не используете битмаску или индекс на основе r-дерева). Поэтому разница (T2-T1) * Log (rows) - может играть роль, если вы часто выполняете свой запрос.