Ваш запрос ... большой. Можете ли вы объяснить, что это для вас? Похоже, что он тянет каждый идентификатор посетителя и независимо от того, являются ли они оператором, если они не являются оператором, и у них есть определенные настройки профиля. Это не имеет смысла, так что я, должно быть, что-то там упускаю.
Вот моя попытка, основанная на моем понимании того, что вы пытаетесь сделать:
select distinct visitor.ID, IF(operator.id IS NOT NULL, 1, 0) AS clazz
from Visitor left outer join Operator on visitor.ID = operator.id
where not exists
(select 'x' from Operator OperatorTwo where OperatorTwo.id = visitor.ID)
and exists
(select 'x' from VisitorProfileField, ProfileField
where VisitorProfileField.profileFieldID = ProfileField.ID
and VisitorProfileField.profileFieldID.visitorID = visitor.ID
and VisitorProfileField.profileFieldID.numberVal = 1
and VisitorProfileField.profileFieldID.stringVal = 'Manual'
and ProfileField .name = 'subscription86')
Объединенная таблица с именем "operator1_1_", по-видимому, не используется, ее можно удалить. Если вы используете его просто для того, чтобы удостовериться, что в этой таблице есть запись для посетителя, я бы использовал вместо существующего соединение «существует». Я бросил это.
Я переключил ваш not in на not not, который, я думаю, может быть проще оптимизировать для MySQL. Я использовал IF вместо случая, потому что у вас есть только два, и это было короче, чтобы напечатать. Я не знаю, является ли один из них быстрее / проще в MySQL.
Я могу вам сказать, что по моему опыту производительность MySQL умирает с подзапросами в запросах. Кажется, что отказывается от их оптимизации и начинает запускать их построчно. Могу поспорить, что если вы используете временную таблицу результатов (только для целей тестирования), ваш запрос будет выполняться намного быстрее.
Изменить:
Билл пошел дальше, чем я, я не зашел достаточно далеко. Мне нравится запрос Билла, и я согласен с его выводами об утверждении CASE, которое меня как-то сбило с толку.