Niestety, zgodnie z dokumentacją MySQL SELECT , „klauzula HAVING jest stosowana prawie jako ostatnia, tuż przed wysłaniem elementów do klienta, bez optymalizacji”.
Różnica polega na tym, że pierwsze zapytanie użyje indeksu pełnotekstowego do obliczenia trafności tylko dla wierszy, które mają „Bob” w name
. Drugie zapytanie obliczy trafność dla wszystkich rzędów, a następnie większość z nich wyrzuć (ewentualnie po posortowaniu całej tabeli). Dlatego drugie zapytanie jest znacznie wolniejsze. Nawet jeśli umieścisz klauzulę ORDER BY w pierwszym zapytaniu, nadal będzie to szybsze niż użycie HAVING:
SELECT name, MATCH(name) AGAINST('Bob') AS relevance
FROM users
WHERE MATCH(name) AGAINST('Bob')
ORDER BY relevance DESC
Ogólnie rzecz biorąc, „nie używaj HAVING dla pozycji, które powinny znajdować się w klauzuli WHERE”.