行の特定のサブセットが読み取りに対してはるかに高温であるテーブルがあるとします。テーブルis_alive
を要求するフラグがある場合のように。people
または、ソフト/論理削除を実装し、検索条件に常にが含まれている場合is_deleted = 0
。
これらのフィールドは、これらのテーブルのインデックスに含める必要がありますか?もしそうなら、彼らはもっと左にすべきですか、それとももっと右にすべきですか?
次のようなインデックスがあるとしましょう...
people [ last_name ]
people [ zip_code ]
people [ gender ]
widgets [ category_id ]
widgets [ seller_id ]
あなたはそれらを次のように見せますか
people [ last_name, is_alive ]
widgets [ category_id, is_valid ]
または
people [ is_alive, last_name ]
widgets [ is_valid, category_id ]
ブール値自体は、他の検索条件と組み合わせない限り、カーディナリティ/重要度が低くなります。
このフィールドはほぼ毎回使用されますが、すべてのインデックスにこのフィールドを追加するのは怪しいと感じます。たぶんそれ自体が「問題」なのだろうか?同じスキーマを持つ別のテーブルに行をシャトルする必要がありますか?基本的にフラグで分割します。
ベンダーにとらわれない。