これはMySQLの既知の欠陥です。
UNION
を使用することはよくあることです 表示されているような範囲クエリよりもパフォーマンスが優れています。 MySQLは、IN (...)
を使用する式にインデックスをあまりインテリジェントに使用しません。 。 OR
を使用したブール式のオプティマイザにも同様の穴があります。 。
httpを参照してください。 ://www.mysqlperformanceblog.com/2006/08/10/using-union-to-implement-loose-index-scan-to-mysql/ いくつかの説明と詳細なベンチマークについて。
オプティマイザーは常に改善されています。 MySQLの1つのバージョンの欠陥は、次のバージョンで改善される可能性があります。したがって、さまざまなバージョンでクエリをテストする価値があります。
UNION ALL
を使用することも有利です 単にUNION
の代わりに 。どちらのクエリも一時テーブルを使用して結果を保存しますが、違いはUNION
DISTINCT
を適用します 結果セットに追加され、インデックス付けされていない並べ替えが追加されます。