あなたのスタイルは非常に珍しいです。
ほとんどの人はおそらくWHERE began_at < NOW() AND finished_at > NOW()
と書くでしょう。
でも。両方のフィールドにインデックスを付けることをお勧めします。
組み合わせたキーは、特定の日付の組み合わせで検索者を高速化するだけなので、役に立ちません。
betreeを使用する場合は、組み合わせたキーが役立ちますが、個別にインデックスを作成する場合ほど良くないため、これは完全には当てはまりません。等しい(=)演算子を使用してフィールドの組み合わせを検索する場合、組み合わせたキーは非常に優れています。 SIngleフィールドインデックスは、ラーゲンリクエストでより優れたパフォーマンスを発揮します。
あなたは「多次元範囲検索」のために少しグーグルすることができます。
その理由は、1つのフィールドで一致するすべてのフィールドが基本的にbtreesのlog(n)時間で見つかるためです。したがって、全体の実行時間はO(k * log(n))、つまりO(log(n))になります。
多次元範囲クエリには、より高いO(sqrt(n))の実行時間があります。ただし、対数ランタイムを達成するより良い実装もあります。ただし、それらはmysqlで完全に実装されていないため、バージョンによってはさらに悪くなるか、ひどいものになります。
要約すると:
-
単一フィールドでの等式比較:ハッシュインデックス(ランタイムO(1))
-
単一フィールドの範囲検索:単一フィールドのbtreeインデックス(O(log(n)))
-
複数のフィールドでの等式検索:結合されたハッシュキー(ランタイムO(1))
それらのケースは明らかです...
- 複数のフィールドでの範囲検索:個別のbtreeインデックス(O(log(n)))
これはそれほど明確ではないところです。現在のバージョンでは、上記の理由により、個別にインデックスを作成する方が明らかに優れています。そのユースケースの完璧な実装を使用すると、組み合わせたキーでパフォーマンスを向上させることができますが、それをサポートするシステムはありません。mysqlはルーズインデックスをサポートします(そのために必要です)バージョン5.0以降ですが、非常に限られており、クエリオプティマイザはまれにafaikでのみそれらを利用します。 5.3などの新しいバージョンについてはわかりません。
ただし、mysqlがルーズインデックスを実装すると、範囲要求を実行したり、さまざまな方向に並べ替えたりするフィールドにキーを組み合わせて、ますます関連性が高まります。