Хранение микросекунд в MySQL: какой обходной путь?

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

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

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

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

3 ответа

Решение

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

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

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

Также взгляните на 10.3.1. Типы DATETIME, DATE и TIMESTAMP

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

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

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

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

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

Следующие пункты суммируют последствия этого изменения. См. Также Раздел 10.3.5, "Дробные секунды в значениях времени".

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

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

Другие вопросы по тегам