Это хорошая идея, чтобы индексировать поле datetime в mysql?


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

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

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

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

2 90

2 ответа:

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 от общего числа строк, будет более эффективно использовать индекс в столбце.

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

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