を含むクエリを作成しようとしていますWHERE isok=1
。名前が示すようにisok
、ブール フィールドです (実際には、TINYINT(1) UNSIGNED
必要に応じて 0 または 1 に設定されます)。
このフィールドにインデックスを付けると、パフォーマンスが向上しますか? エンジン (この場合は InnoDB) のインデックス検索のパフォーマンスは向上しますか、それとも低下しますか?
あまり。本と同じように考える必要があります。本に 3 種類の単語しかなく、すべてをインデックスに登録すると、通常のページと同じ数のインデックス ページが作成されます。
1 つの値のレコードが比較的少ない場合は、パフォーマンスが向上します。たとえば、1000 件のレコードがあり、そのうち 10 件が TRUE の場合、次のように検索すると便利です。isok = 1
Michael Durrant が述べたように、書き込みも遅くなります。
編集:重複の可能性:ブール値フィールドのインデックス作成
ここでは、インデックスがあっても、レコードが多すぎるとインデックスを使用しないことを説明しています。 = 1 をチェックするときにMySQLはインデックスを使用しませんが、 = 0 で使用します
これは、実際のクエリと、インデックスとクエリの組み合わせの選択性によって異なります。
ケース A : 条件WHERE isok = 1
と他に何もない:
SELECT *
FROM tableX
WHERE isok = 1
インデックスが十分に選択的である場合 (たとえば、1M 行があり、1k 行しかない場合isok = 1
)、SQL エンジンはおそらくインデックスを使用し、インデックスがない場合よりも高速になります。
インデックスが十分に選択的でない場合 (たとえば、100 万行あり、10 万行以上ある場合isok = 1
)、SQL エンジンはおそらくインデックスを使用せず、テーブル スキャンを実行します。
ケース B : 状態WHERE isok = 1
とその他のもの:
SELECT *
FROM tableX
WHERE isok = 1
AND another_column = 17
次に、他にどのようなインデックスがあるかによって異なります。上のインデックスは、可能な値が 2 つしかないanother_column
インデックスよりも選択的である可能性があります。orisok
のインデックスはさらに優れています。(another_column, isok)
(isok, another_column)
いいえ、通常はありません。
通常、フィールドの選択性/カーディナリティが高い場合は、検索用にフィールドにインデックスを付けます。ブール型フィールドの基数は、ほとんどのテーブルで非常に低くなります。また、書き込みがわずかに遅くなります。
実際、これは実行するクエリによって異なります。ただし、一般的にはい、他のタイプのフィールドのインデックス作成も同様です。
はい、インデックスはパフォーマンスを向上させます。インデックスがある場合とない場合の EXPLAIN の出力を確認してください。
ドキュメントから:
インデックスは、特定の列の値を持つ行をすばやく見つけるために使用されます。インデックスがない場合、MySQL は最初の行から始めて、テーブル全体を読み取って関連する行を見つける必要があります。テーブルが大きいほど、このコストは高くなります。テーブルに問題の列のインデックスがある場合、MySQL は、すべてのデータを調べる必要なく、データ ファイルの途中でシークする位置をすばやく判断できます。
この場合、インデックスがパフォーマンスを低下させないと言っても安全だと思うので、それから得るだけです。