Я работаю над проектированием большой базы данных. В моем приложении у меня будет много строк, например, сейчас у меня одна таблица с 4 миллионами записей. Большинство моих запросов используют предложение datetime для выбора данных. Это хорошая идея для индексации полей даты и времени в базе данных MySQL?
Select field1, field2,.....,field15
from table where field 20 between now() and now + 30 days
Я стараюсь, чтобы моя база данных работала хорошо, а запросы выполнялись гладко
Более того, какая идея, по вашему мнению, должна была создать высокоэффективную базу данных?
field 20
?Ответы:
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).
источник
SELECT
запрос быстрее, даже если я проиндексировалdate time
столбец. .. index сделать запрос быстро, когда я используюequal
операцию. Я прав?Проведенные автором тесты показали, что целочисленная временная метка unix лучше, чем DateTime. Обратите внимание, он использовал MySql. Но я чувствую, что независимо от того, какой движок БД вы используете, сравнение целых чисел немного быстрее, чем сравнение дат, поэтому индекс int лучше, чем индекс DateTime. Возьмем T1 - время сравнения двух дат, T2 - время сравнения двух чисел. Поиск по индексированному полю занимает приблизительно O (log (row)) время, потому что индекс основан на некотором сбалансированном дереве - он может быть разным для разных механизмов DB, но в любом случае Log (row) является общей оценкой. (если вы не используете битовую маску или индекс на основе r-дерева). Таким образом, разница составляет (T2-T1) * Log (rows) - может играть роль, если вы часто выполняете свой запрос.
источник