128

を含むクエリを作成しようとしていますWHERE isok=1。名前が示すようにisok、ブール フィールドです (実際には、TINYINT(1) UNSIGNED必要に応じて 0 または 1 に設定されます)。

このフィールドにインデックスを付けると、パフォーマンスが向上しますか? エンジン (この場合は InnoDB) のインデックス検索のパフォーマンスは向上しますか、それとも低下しますか?

4

8 に答える 8

98

あまり。本と同じように考える必要があります。本に 3 種類の単語しかなく、すべてをインデックスに登録すると、通常のページと同じ数のインデックス ページが作成されます。

1 つの値のレコードが比較的少ない場合は、パフォーマンスが向上します。たとえば、1000 件のレコードがあり、そのうち 10 件が TRUE の場合、次のように検索すると便利です。isok = 1

Michael Durrant が述べたように、書き込みも遅くなります。

編集:重複の可能性:ブール値フィールドのインデックス作成

ここでは、インデックスがあっても、レコードが多すぎるとインデックスを使用しないことを説明しています。 = 1 をチェックするときにMySQLはインデックスを使用しませんが、 = 0 で使用します

于 2012-05-09T22:02:12.383 に答える
38

これは、実際のクエリと、インデックスとクエリの組み合わせの選択性によって異なります。

ケース 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)

于 2012-05-09T22:11:27.223 に答える
5

いいえ、通常はありません。

通常、フィールドの選択性/カーディナリティが高い場合は、検索用にフィールドにインデックスを付けます。ブール型フィールドの基数は、ほとんどのテーブルで非常に低くなります。また、書き込みがわずかに遅くなります。

于 2012-05-09T22:05:20.297 に答える
3

実際、これは実行するクエリによって異なります。ただし、一般的にはい、他のタイプのフィールドのインデックス作成も同様です。

于 2012-05-09T21:59:40.967 に答える
0

はい、インデックスはパフォーマンスを向上させます。インデックスがある場合とない場合の EXPLAIN の出力を確認してください。

ドキュメントから:

インデックスは、特定の列の値を持つ行をすばやく見つけるために使用されます。インデックスがない場合、MySQL は最初の行から始めて、テーブル全体を読み取って関連する行を見つける必要があります。テーブルが大きいほど、このコストは高くなります。テーブルに問題の列のインデックスがある場合、MySQL は、すべてのデータを調べる必要なく、データ ファイルの途中でシークする位置をすばやく判断できます。

この場合、インデックスがパフォーマンスを低下させないと言っても安全だと思うので、それから得るだけです。

于 2012-05-09T21:59:54.493 に答える