Если предложения людей не обеспечивают существенного увеличения скорости, существует вероятность того, что ваша настоящая проблема заключается в том, что лучший план запроса для двух возможных условий соединения различен. Для этой ситуации вам нужно выполнить два запроса и каким-то образом объединить результаты. Это, вероятно, сделает ваш запрос намного более уродливым.
Один неясный трюк, который я использовал для такой ситуации, - это выполнение GROUP BY из запроса UNION ALL. Идея выглядит так:
SELECT a_field1, a_field2, ...
MAX(b_field1) as b_field1, MAX(b_field2) as b_field2, ...
FROM (
SELECT a.field_1 as a_field1, ..., b.field1 as b_field1, ...
FROM current_tbl a
LEFT JOIN import_tbl b
ON a.user_id = b.user_id
UNION ALL
SELECT a.field_1 as a_field1, ..., b.field1 as b_field1, ...
FROM current_tbl a
LEFT JOIN import_tbl b
ON a.f_name = b.f_name AND a.l_name = b.l_name
)
GROUP BY a_field1, a_field2, ...
И теперь база данных может выполнять каждое из двух объединений, используя наиболее эффективный план.
(Предупреждение о недостатке в этом подходе. Если строка в current_tbl присоединяется к нескольким строкам в import_tbl, то вы получите очень странное объединение данных.)
Случайный случайный совет. Если у вас нет оснований полагать, что есть потенциальные повторяющиеся строки, избегайте DISTINCT. Это вызывает неявную GROUP BY, которая может быть дорогой.