Наиболее близкое соответствие для полей даты и времени MySQL

#mysql #performance

#mysql #Производительность

Вопрос:

У меня есть необработанные данные от двух датчиков в базе данных. Чтобы вычислить значимые результаты от этих датчиков, мне нужно по одной точке данных от каждого. Загвоздка в том, что их временные метки не гарантированно точно совпадают. Я мог бы сделать запрос для MySQL, чтобы он взял временную метку от одного датчика и нашел временную метку, которая является ближайшей для другого датчика, но этот запрос нужно было бы запускать для каждой строки, а затем снова всякий раз, когда добавляется новая строка, и я обеспокоен тем, что поиск по таблице всякий раз, когда вставляется точка данных, может стать нагрузкой на производительность, особенно если добавлено больше таких датчиков, как этот. По крайней мере, для наивного алгоритма поиск ближайшей временной метки выглядит как операция с линейным временем. Может ли это вызвать проблемы с производительностью, или у MySQL есть оптимизация в этом отношении?

Ответ №1:

Вы могли бы использовать простой запрос для получения результата, наиболее близкого к заданному значению:

 SELECT `timestampcolumn`
FROM `thetable`
ORDER BY ABS(`timestampcolumn` - givenvalue)
LIMIT 1
  

Должно сработать и не требует больших затрат производительности, если вы используете индекс в правильных столбцах. MySQL создан для подобных запросов.

Комментарии:

1. Спасибо. Индексы звучат как раз так, как я искал.

Ответ №2:

  1. Вы можете использовать функции MySQL, чтобы создать маску для преобразования метки времени в японскую дату, например 20130109 (ггггмддххм мссззз) или с помощью кода, использующего PHP, java и т.д.;

  2. Во время попытки найти строки с помощью SELECT вы можете делать такие вещи, как:

SELECT * FROM TABLE WHERE ADATE BETWEEN(LEFT(BEGINDATE, 8), LEFT(ENDDATE, 8));

или

SELECT * FROM TABLE WHERE ADATA < LEFT(MYDATE, 8) LIMIT 1;

или

ИСПОЛЬЗУЙТЕ ПОДСТАНОВОЧНЫЙ ЗНАК ТИПА «_» В НУЖНОМ ВАМ МЕСТЕ, НАПРИМЕР, МЕСЯЦ Или ДЕНЬ, КОТОРЫЙ ВЫ ХОТИТЕ ИЗМЕНИТЬ.