Vous pouvez créer une "vue matérialisée".http://en.wikipedia.org/wiki/Materialized_view
essentiellement une table qui est les résultats du JOIN, et la création d'un index de texte intégral à ce sujet.
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)
Vous pouvez alors exécuter des requêtes sur cette table à la place..
SELECT * FROM materialized WHERE MATCH(user_name,department_name) AGAINST('test' IN BOOLEAN MODE)
mais...
Vous devrez mettre à jour la table périodiquement (ou lorsque les tables sous-jacentes sont mises à jour) - le plus simple est simplement de DROP
et recréer - Ou vous pouvez utiliser TRUNCATE
puis INSERT INTO ... SELECT ... FROM ...
format.
(des schémas plus élaborés impliquent des déclencheurs pour maintenir la "vue" à jour, ou même regarder le binlog et relire les mises à jour par rapport à la "vue")