Sql — альтернатива не существует для диапазона дат

#mysql #sql

Вопрос:

У меня есть таблица датчиков и таблица для sensor_data. Они оба связаны общим столбцом uuid.

 **Table sensor:**  
ID    uuid  

**Table B**  
ID    uuid  server_time
 

Мне нужно найти количество датчиков, которые не давали данных в течение заданного периода времени. Для этого я использую приведенный ниже запрос

 select count(distinct s.uuid) 
from sensor s 
where  not 
  (exists 
    (select 1 from sensor_data d where d.uuid=s.uuid and 
      (d.server_time between ? and ?)
    )
  )
 

Из-за огромного размера таблицы этот запрос работает плохо. Какова эффективная альтернатива этому запросу?

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

1. Я бы попытался сформулировать это с помощью EXISTS vs NOT EXISTS (и вычесть результат из числа датчиков).

2. Здесь нет таблицы sensor_data.

Ответ №1:

Вы мало что можете сделать, чтобы переформулировать запрос. Что вы можете сделать, так это добавить индекс sensor_data(uuid, server_time) , который должен помочь.

Кроме того, если uuid он уникален sensor , то просто используйте count(*) , а не count(distinct) .

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

1. Что насчет этого запроса выберите * ИЗ датчика s слева, чтобы присоединиться к датчику d на s.uuid=d.uuid и d.server_time между ‘2020-06-23 13:32:10’ и ‘2021-08-04 13:32:10’, где d.id равно нулю

2. @devJoshi . . . Стоит попробовать, но я бы ожидал, что у него будут аналогичные характеристики производительности. Ему нужен был бы тот же индекс.

3. Разве СУЩЕСТВОВАНИЕ не было бы более эффективным, чем НЕ СУЩЕСТВУЕТ?

4. @CetinBasoz . . . Я не вижу, как exists бы ответить на этот вопрос, но вы можете дать ответ.