MySQL порядок исполнения - PullRequest
2 голосов
/ 11 июля 2019

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

* 1003 Т.е. *

SELECT Account.id, 
(IFNULL(**Should send message query**, 
    IFNULL(**Should check inbox**, NULL))) as nextTask FROM Account

На самом деле строка IFNULL составляет около 10, каждый довольно сложный подзапрос.

Я хочу знать, будет ли MySQL вычислять значения для следующего выражения IFNULL, если выполнено первое. То есть, если учетная запись должна отправлять сообщение, она не должна беспокоить вычисление подзапроса для Следует проверить входящие сообщения

Так работает MySQL?

В чем разница между этим и CASE WHEN's

* 1016 Е.Г. *

CASE WHEN **Should send message** THEN **Should send message**
    WHEN **Should check inbox** THEN **Should check inbox**
END

Я просто хочу снизить нагрузку на процессор для этого запроса.

1 Ответ

1 голос
/ 11 июля 2019

То, что вы пытаетесь, лучше всего сделать, используя COALESCE(value,...)

Возвращает первое ненулевое значение в списке или NULL, если нет ненулевые значения.

Так было бы:

SELECT
    Account.id, 
    COALESCE(
        **Should send message query**, 
        **Should check inbox**
    ) as nextTask
FROM Account

Теперь к вашему актуальному вопросу

Я хочу знать, будет ли MySQL вычислять значения для следующих [IFNULL] выражение, если первое выполнено.

У двигателя нет причин для этого. Вы можете проверить это с помощью следующего скрипта:

set @executed1 = 'no';
set @executed2 = 'no';

select coalesce(
  @executed1 := 'yes', -- evaluates to non null
  @executed2 := 'yes'
);

select @executed1, @executed2;

Результат:

@executed1 | @executed2
yes        | no

Как видите, второе выражение не выполняется, так как первое выражение было оценено как ненулевое значение.

set @executed1 = 'no';
set @executed2 = 'no';

select coalesce(
  nullif(@executed1 := 'yes', 'yes'), -- evaluates to null
  @executed2 := 'yes'
);

select @executed1, @executed2;

Результат:

@executed1 | @executed2
yes        | yes

Здесь оба выражения были выполнены, потому что первое было оценено как NULL.

дб-скрипка

Я бы сказал - То же самое верно для IFNULL. Но я бы не стал этим пользоваться. По крайней мере, не в вашем случае.

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