Możesz utworzyć „widok zmaterializowany”.http://en.wikipedia.org/wiki/Materialized_view
w zasadzie tabela, która jest wynikiem JOIN, i tworzy na niej indeks pełnotekstowy.
CREATE TABLE materialized (FULLTEXT idx (user_name,department_name))
SELECT u.id,user_name,department_name
FROM users u INNER JOIN departments d ON (d.id = dept_id)
Zamiast tego możesz uruchamiać zapytania na tej tabeli.
SELECT * FROM materialized WHERE MATCH(user_name,department_name) AGAINST('test' IN BOOLEAN MODE)
ale...
Będziesz musiał okresowo aktualizować tabelę (lub gdy aktualizują się tabele bazowe) - najłatwiej jest po prostu DROP
i odtwórz — możesz też użyć TRUNCATE
następnie INSERT INTO ... SELECT ... FROM ...
format.
(bardziej rozbudowane schematy obejmują wyzwalacze, aby aktualizować „widok”, a nawet oglądać binlog i odtwarzać aktualizacje względem „widoku”)