MySQL: Использование подзапроса в предложении SELECT и сколько раз он выполняется? - PullRequest
0 голосов
/ 26 марта 2020

Если у меня есть запрос, такой как:

SELECT firstName, age, COALESCE(studentStatus, SELECT status FROM Statuses WHERE default = true) FROM Student;

Сколько раз выполняется запрос внутри COALESCE? Я думаю, так как он не зависит от внешнего запроса, он должен быть выполнен только один раз. Это правда и как это работает? MySQL кеширует результат где-нибудь?

1 Ответ

1 голос
/ 27 марта 2020

Используйте EXPLAIN, чтобы увидеть план выполнения запроса. MySQL может выполнить этот подзапрос для каждой строки, возвращаемой внешним запросом, это будет допустимо. Поскольку это не коррелированный подзапрос, вполне вероятно, что MySQL оптимизирует его, выполняя подзапрос один раз, и кеширует результат, и возвращает кэшированное значение для каждой строки.

Обратите внимание, что если этот подзапрос когда-либо будет вернуть более одной строки, тогда весь оператор выдаст ошибку. Подзапрос в списке SELECT должен включать какую-то гарантию того, что он не вернет более одной строки. Либо агрегат в списке SELECT (например, SELECT MAX(status)), либо предложение LIMIT 1.


ПРИМЕЧАНИЕ:

Хранить атрибут age обычно плохая идея. Возраст человека определяется как разница в годах между датой рождения и текущей датой. Если мы хотим установить возраст «по состоянию на» конкретной даты, мы используем эту дату вместо текущей даты.


Моим личным предпочтением было бы избегать выполнения подзапроса в списке SELECT и выполнять присоединиться к встроенному представлению, которое возвращает статус по умолчанию.


В: Можете ли вы привести пример достижения вышеуказанного с помощью объединения?

Вот пример :

SELECT t.firstname                              AS `first_name`
     , TIMESTAMPDIFF(YEAR,t.dob,DATE(NOW()))    AS `age_yrs` 
     , IFNULL(t.studentstatus,s.default_status) AS `status`
  FROM `Student` t
 CROSS
  JOIN ( SELECT MAX(d.status) AS default_status
           FROM `Statuses` d
          WHERE d.default = TRUE
       ) s
 ORDER
    BY t.firstname
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...