Минорные релизы MySQL 8 совсем не минорные и у этого есть как минусы (в случае проблем откатиться обратно на предыдущий минорный релиз не выйдет), так и плюсы, т.к. в них появляются новые фишки и улучшения.
В 8.0.17 к примеру завезли оптимизацию запросов с NOT EXISTS:
The optimizer now transforms a
WHERE
condition havingNOT IN (
,subquery
)NOT EXISTS (
,subquery
)IN (
, orsubquery
) IS NOT TRUEEXISTS (
internally into an antijoin, thus removing the subquery.subquery
) IS NOT TRUE
Пример, имеем запрос:
SELECT
task
.TaskID
FROM contact
INNER JOINlogin
ONlogin
.LoginID =contact
.LoginID
INNER JOINtask
ONtask
.TaskID =contact
.TaskID
LEFT OUTER JOIN taskstar ON taskstar.TaskID =task
.TaskID AND taskstar.LoginID
= 858636
INNER JOINtaskaccess
accesslogined ONtask
.TaskID =accesslogined
.TaskID ANDaccesslogined
.LoginID = 858636
WHERE 1
AND contact.ContactBool_1 = 0
AND contact.ContactSpam = 0
ANDtask
.TaskType = 4
ANDcontact
.ContactIsDeleted = 0
ANDtask
.TaskIsDeleted = 0
AND (NOT EXISTS(SELECT 1
FROMtask
WHERE ClientID =contact
.ContactID
ANDtask
.TaskIsDeleted = 0
AND (task
.TaskType = 0)
ANDtask
.TaskStatusSetID = 57450)
)
GROUP BY task.TaskID
ORDER BY task.TaskID
LIMIT 0,5
Выполняем его в MySQL 8.0.16 и получаем:
5 rows in set (1 min 9.92 sec)
Больше минуты, совсем некомфортно.
Обновляем MySQL и выполняем его же в 8.0.17:
5 rows in set (1.02 sec)
Профит 🙂