Memecache ces requêtes de frappe/réponses de base de données et évite le voyage vers la base de données à chaque fois après la première.
Ou générez une liste précompilée des phrases de saisie semi-automatique possibles, mettez en cache en mémoire et interrogez-la au lieu de la base de données. Pourquoi avez-vous besoin d'interroger la base de données pour un champ de recherche ? Générez une liste acceptable et utilisez-la au lieu d'établir une connexion entre plusieurs niveaux !
Ou assurez-vous qu'il existe des index sur les tables que votre requête à la base de données crée.