Хранение микросекунд в MySQL:какое обходное решение?

мы пишем научный инструмент с поддержкой MySQL. Проблема в том, что нам нужна микросекундная точность для наших полей datetime, которые MySQL в настоящее время не поддерживает. Я вижу здесь, по крайней мере, два обходных пути:

  • используя тип столбца decimal (), с целой частью, соответствующей секундам с некоторого момента времени (я сомневаюсь, что эпоха UNIX будет делать, так как мы должны хранить измерения, сделанные в 60-х и 50-х годах).
  • используя два целочисленных столбца, один для секунд, другой на микросекунды.

наиболее популярным запросом является выбор столбцов, соответствующих временному интервалу (т. е. dt_record > time1 и dt_record

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

3 ответов


Если вы говорите, что самые популярные запросы являются базой времени,Я бы рекомендовал идти с одним столбцом, который хранит время, как в вашем первом варианте.

вы можете выбрать свою собственную эпоху для приложения и работать оттуда.

Это должно упростить запросы, которые должны быть написаны при поиске временных интервалов.

Смотрите также 10.3.1. Типы DATETIME, DATE и TIMESTAMP

однако микросекунды не могут быть сохранены в столбец любых временных данных тип. Любая часть микросекунд отброшенный. Преобразование времени или Значения DATETIME в числовую форму (для пример, добавив +0) приводит к двойное значение с частью микросекунд из. 000000


MySQL будет поддерживать микросекунды, см. MySQL 5.6.4 список изменений:

Обработка Дробных Секунд

несовместимое изменение: MySQL теперь разрешает дробные секунды для времени, Значения DATETIME и TIMESTAMP с точностью до микросекунд (6 цифр) точность. Определение столбца, включающего часть с дробными секундами, используйте синтаксис type_name (fsp), где type_name-время, время или Метка времени, а fsp-дробные секунды точность. Например:

создать таблицу t1(t TIME (3), DT DATETIME(6)); значение fsp, если задано, должна быть в диапазоне от 0 до 6. Значение 0 означает, что нет дробная часть. Если опущено, точность по умолчанию равна 0. (Это отличается из стандартного SQL по умолчанию 6, для совместимости с предыдущим Версии MySQL.)

следующие пункты обобщают последствия этого изменения. Видеть также раздел 10.3.5, " доли секунды во времени Значения."


Как насчет разделения частей даты на часть только даты и микросекунды от полуночи? Есть менее 2^64 микросекунд в день. Затем сгруппируйте таблицу на {дата, микросекунда}.

Я бы предположил, хотя я не знаю ваших данных, что некоторые запросы будут в порядке с точностью дневного уровня- "эксперименты в 1964 году" не должны беспокоиться о микросекундах.