Минорные релизы MySQL 8 совсем не минорные и у этого есть как минусы (в случае проблем откатиться обратно на предыдущий минорный релиз не выйдет), так и плюсы, т.к. в них появляются новые фишки и улучшения.
В 8.0.17 к примеру завезли оптимизацию запросов с NOT EXISTS:
The optimizer now transforms a
WHEREcondition 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 JOINloginONlogin.LoginID =contact.LoginID
INNER JOINtaskONtask.TaskID =contact.TaskID
LEFT OUTER JOIN taskstar ON taskstar.TaskID =task.TaskID AND taskstar.LoginID= 858636
INNER JOINtaskaccessaccesslogined 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)
Профит 🙂