#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
бы ответить на этот вопрос, но вы можете дать ответ.