残念ながら、MySQLSELECTドキュメント によると 、「HAVING句は、アイテムがクライアントに送信される直前に、最適化なしでほぼ最後に適用されます。」
違いは、最初のクエリがフルテキストインデックスを使用して、関連性をのみ計算することです。 name
に「Bob」が含まれる行の場合 。 2番目のクエリは、すべての関連性を計算します 行、次にそれらのほとんどを破棄します(おそらくテーブル全体をソートした後)。したがって、2番目のクエリは大幅に遅くなります。最初のクエリにORDERBY句を配置した場合でも、HAVINGを使用するよりも高速です:
SELECT name, MATCH(name) AGAINST('Bob') AS relevance
FROM users
WHERE MATCH(name) AGAINST('Bob')
ORDER BY relevance DESC
一般に、「WHERE句に含める必要のあるアイテムにはHAVINGを使用しないでください。」