Для начала вы возвращаете тот же результат для 'col1' в случае, если v.name имеет значение null или v.name! = 'Text'. Тем не менее, вы можете включить это дополнительное условие в соединение с таблицей 2 и использовать функцию IFNULL.
Если вы фильтруете table3 по field2, вы, вероятно, могли бы создать индекс по таблице 3, который включает field2.
Вам также следует проверить, можете ли вы включить какой-либо дополнительный фильтр для любой из этих таблиц, и если вы это сделаете, вы можете рассмотреть возможность использования хранимой процедуры для получения результатов.
Кроме того, я не понимаю, почему вам нужно объединить первое объединение в 'MS', вы можете легко выполнить все объединения за один раз:
SELECT
M.*,
TIMESTAMPDIFF(YEAR, M.date, CURDATE()) AS age,
IFNULL(V.name, M.name) as col1,
P.Counts
FROM table1 M
LEFT JOIN table2 V ON M.id=V.id AND V.name <> 'text'
LEFT JOIN
(SELECT
E.id,
COUNT(E.id) Counts
FROM table3 E
WHERE E.field2 = 'value1'
GROUP BY E.id) AS P ON M.id=P.id;
Я также предполагаю, что у вас есть кластеризованные индексы для всех полей идентификаторов во всех этих трех таблицах, но без фильтра, если вы имеете дело с миллионами неактивных записей, это всегда будет большой тяжелый запрос. По меньшей мере, вы делаете сканирование таблицы для table1.
Я включил эту дополнительную информацию после вашего комментария.
Я упомянул кластерный индекс, но согласно официальной документации по индексам здесь
Когда вы определяете ПЕРВИЧНЫЙ КЛЮЧ в своей таблице, InnoDB использует его в качестве кластеризованного индекса. Поэтому, если у вас уже есть первичный ключ, вам больше ничего не нужно делать.
В документации также указано, что вы должны определить первичный ключ для каждой создаваемой таблицы.
Если у вас нет первичного ключа. Вот фрагмент кода, который вы запросили.
ALTER TABLE table1 ADD CONSTRAINT pk_table1
PRIMARY KEY CLUSTERED (id);
ВНИМАНИЕ: Имейте в виду, что создание кластеризованного индекса является большой операцией для таблиц, подобных вашей, с тонами данных.
Это не то, что вы хотите сделать без планирования на рабочем сервере. Эта операция также займет много времени, и таблица будет заблокирована во время процесса.