установка LIMIT для подзапроса, когда количество возвращаемых строк не имеет значения - PullRequest
0 голосов
/ 18 февраля 2019

я использую платформу ORM для выполнения моих запросов ... вот пример вывода запроса ORM ... это реляционный запрос

  select * from `clients` where exists 
  (select * from `transactions` where `clients`.`id` = `transactions`.`client_id`  )
  order by `id` desc limit 20 offset 02

Мне было интересно, есть ли какое-либо ограничение на подзапросВ этом запросе повышается производительность, поскольку не имеет значения, сколько строк он возвращает

, например

  (select * from `transactions` where `clients`.`id` = `transactions`.`client_id`  LIMIT 1 )

, или производительность в этом сценарии не зависит от того, сколько строк мы выбрали в подзапросе?

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019
where exists 
(select * from `transactions` where `clients`.`id` = `transactions`.`client_id`  )

Запрос используется в качестве аргумента для условия EXISTS.По-английски это можно перевести как: у этого клиента есть хотя бы одна транзакция.

При обработке этого типа условия MySQL обычно оптимизирует процесс, чтобы просто проверить, что подзапрос возвращает хотя бы одну запись.Использование LIMIT в этом контексте бесполезно, ваша СУБД знает лучше.

0 голосов
/ 18 февраля 2019

Прежде всего, использование LIMIT без ORDER BY является довольно бессмысленной вещью, поскольку в предложенном вами подзапросе вы не указываете MySQL , какую отдельную запись вы хотите сохранить.

Далее, вы абсолютно не хотите потенциально ограничить существующий подзапрос, потому что тогда вы можете вызвать преждевременный сбой его, прежде чем дать ему шанс найти совпадение.Весь смысл существующего подзапроса состоит в том, чтобы потенциально просканировать всю таблицу transactions в поисках соответствия клиента.

Положительное предложение EXISTS уже оптимизировано в том смысле, что MySQL остановится, как только найдетодин матч.

...