あなたのようなブール (true と false、または 1 と 0) 列は、状況によっては問題ありませんが、そのような列にインデックスを付けていることに気付いた場合は、おそらく一線を越えています。
値が均等に分散されている場合 (50% が true で 50% が false)、MySQL はインデックスを使用することさえありません (カバー インデックスでない限り)。データセットの大部分が返されるセカンダリ インデックスを介して各行を検索するコストは高くつくため、MySQL は代わりに単純なテーブル スキャンを実行します。
あなたの場合、より小さな分布 (1% false) に対してクエリを実行しているため、MySQL は実際にインデックスを利用する可能性があります。
ただし、使用されていない真の値をインデックスに格納する必要があるのに、インデックスの更新が遅くなり、スペースが無駄になるだけです。
...改訂...
代わりに、インデックスを別のテーブルの形式で外部に格納することを検討してください。次の構造を持つ open_deals という名前のテーブルを追加することを検討してください。ここで、deal_id は、取引と open_deals の両方の主キーです。
deal_id
----------
100
121
135
オープン ディールを取得するには、次の操作を行うだけです。
SELECT deals.*
FROM open_deals
STRAIGHT_JOIN deals
ON deals.deal_id = open_deals.deal_id
左から右に結合することが常にわかっているため、ストレート結合を使用し、MySQL がそれについて考える必要がないようにします。
open_deals は 1 つのインデックス付き列のみで構成されているため、インデックスはカバリング インデックスとして機能します。適切に構成された強力なサーバーでは、インデックスがメモリに格納されるため、テーブルは非常に高速になります。
結合は、内部的には元のセカンダリ インデックスを使用する場合と似ていますが、未使用の値すべてによるオーバーヘッドはありません。
最高のパフォーマンスを得るには、新しい値が open_deals テーブルの末尾に追加されていることを確認してください。つまり、すべての新しい値が最後の値よりも大きくなる必要がありますが、とにかくそうしています。
取引をオープンに設定するには、それを open_deals テーブルに追加し、クローズとしてマークするには、open_deals テーブルから ID を削除します。
ここでの利点は、テーブル間でレコードを移動する必要がなく、他のインデックスを更新する必要がないことです (InnoDB のクラスター化インデックスではさらに悪いことです)。ここで更新される唯一のインデックスは、open_deals テーブルのかなり小さいインデックスです。