Я надеюсь, что оптимизатор запросов сделает это за вас, но вы можете попробовать выполнить выборку по тегам по user_id перед выполнением объединения на всякий случай в первом подзапросе. Это уменьшит количество строк, к которым вам, вероятно, придется присоединиться. Вы также, вероятно, хотите иметь индексы для auto_id и user_ID.
SELECT DISTINCT *
FROM (
(SELECT ta.auto_id, li.address, li.title, GROUP_CONCAT( ta.tag ),
li.description, li.keyword, li.rating, li.timestamp
FROM (SELECT auto_id, tag FROM tags WHERE user_id = 1) AS ta
INNER JOIN links AS li ON ta.auto_id = li.auto_id
WHERE (ta.tag LIKE '%query%') OR (li.keyword LIKE '%query%')
GROUP BY li.auto_id
)
UNION (
SELECT auto_id, address, title, '', description, keyword, rating, `timestamp`
FROM links
WHERE user_id = 1 AND (keyword LIKE '%query%')
)
) AS total
GROUP BY total.auto_id