Хранение микросекунд в 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 году" не должны беспокоиться о микросекундах.