Сравнение количества (*) с выбором для одного результата - PullRequest
1 голос
/ 04 мая 2020

У меня есть таблица tb_xyz, имеющая field1, field2 в качестве индексированного.

Теперь у меня есть два запроса:

SELECT `id` 
FROM `tb_xyz` force index(field1, field2, date_utc) 
WHERE `field1`=472
  AND `field2`=49066
  AND `date_utc` >= DATE(NOW() - interval 1 day)
  AND `date_utc` <= DATE(NOW() + interval 1 day)
  AND `status` NOT IN (1,4,6) 
LIMIT 1

и

SELECT count(*) AS cnt
FROM `tb_xyz` force index(user_id, fleet_id, job_date_utc)
WHERE `field1`=472
  AND `field2`=49066
  AND `date_utc` >= date(now() - interval 1 day)
  AND `date_utc` <= date(now() + interval 1 day)
  AND `status` NOT IN (1,4,6)

Предполагается, что оба запросы пишутся, чтобы просто проверить, выполняется ли это условие хотя бы один раз. Какой из них является более оптимальным. Я пытался проверить их время выполнения, но результаты были небольшими для небольших данных.

1 Ответ

2 голосов
/ 04 мая 2020

Первый запрос (SELECT ... LIMIT 1) будет работать лучше, поскольку он может остановить сканирование таблицы, как только найдет подходящую строку, в то время как запрос COUNT(*) должен будет просмотреть всю таблицу, чтобы вычислить ее результат. Вы можете обнаружить, что использование EXISTS:

SELECT EXISTS (
    SELECT *
    FROM `tb_xyz` force index(user_id, fleet_id, job_date_utc)
    WHERE `field1`=472
      AND `field2`=49066
      AND `date_utc` >= date(now() - interval 1 day)
      AND `date_utc` <= date(now() + interval 1 day)
      AND `status` NOT IN (1,4,6)
)

даже более эффективно, чем запрос LIMIT; просмотр вашего плана выполнения (из EXPLAIN <query>) позволит вам узнать, есть ли разница между ними, что может привести к разнице в производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...