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


138

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

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

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

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


Что field 20?
AlikElzin-kilaka

Ответы:


165

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).


3
Спасибо за объяснение. Это действительно поможет. Я уверен, что у меня будет больше фильтров. Я просто хочу убедиться, что поле даты и времени индексации является хорошей идеей или нет, поскольку у нас может быть дублирование даты и времени. но ты ответ объяснил это :) Спасибо
Джейлен

4
+1 за «те, которые используются в соединениях и пунктах где». Отличное правило для стратегии индексации. Очевидно, сейчас я думаю об этом, но раньше мне не приходило в голову
Gaz_Edge

1
Но если вы запрашиваете данные с диапазоном дат , таким как диапазон данных от «2017-01-01 11:20» до «2018-01-03 12:12», это не сделает SELECTзапрос быстрее, даже если я проиндексировал date timeстолбец. .. index сделать запрос быстро, когда я использую equalоперацию. Я прав?
user3595632

1
Как насчет того, чтобы запрашивать поля datetime с функциями времени, такими как DAY (datetime) или HOUR (datetime). Индекс поможет или помешает в этом случае?
cronoklee

Привет @Explosion Pills, если мне нужно будет только запросить базу данных по году и месяцу, я получу лучшую производительность, если создаю новый столбец, содержащий только год и месяц, а затем индексирую его, вместо того, чтобы создавать индекс столбца datetime напрямую ? Таким образом, я создаю столбец, значение которого похоже на 201801.
Woods Chen

18

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


Спасибо. Я думал об этом как об одном варианте, но не знал, как к нему подойти. Я считаю, что вы абсолютно правы, целые числа всегда быстрее.
Jaylen

62
Лучше? Я сомневаюсь, что временная метка Unix лучше для всех случаев. Да, хранение целого числа обычно быстрее, чем сохранение строки, но как насчет всех функций DateTime, предоставляемых MySQL? Реализация их самостоятельно может оказать негативное влияние на производительность или функциональность.
Грег
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.