8

MySQLでは、このクエリを高速化するためにインデックスを構築する方法は?

SELECT c1, c2 FROM t WHERE c3='foobar';
4

2 に答える 2

12

本当に答えを出すには、すでに既存のインデックスがあるかどうかを確認すると便利ですが...

これはすべて、テーブル「t」が存在し、インデックスを追加する必要があり、現在、主キーに単一のインデックスしかないか、インデックスがまったくないことを前提としています。

クエリのカバリング インデックスを使用すると、ニーズに最適なパフォーマンスが得られますが、インデックスを使用すると、挿入速度がいくらか犠牲になります。その犠牲がどれほど重要かは、アプリケーションのプロファイルによって異なります。主に表から読み取る場合は、それほど重要ではありません。少数のインデックスしかない場合は、中程度の書き込み負荷でも問題ありません。テーブルの限られたストレージ スペースも問題になる可能性があります... トレードオフの最終的な評価を行い、それが目立つかどうかを確認する必要があります。良いことは、それがかなり一定のヒットであることです。通常、インデックスを追加しても、挿入が指数関数的に遅くなるわけではなく、直線的に遅くなります。

とにかく、最高のパフォーマンスを選択するためのオプションは次のとおりです。

  1. c3 がテーブル t の主キーである場合、インデックスを使用してクエリを高速化するためにクエリを改善することはできません。
  2. c1 が主キー t であると仮定します。

    ALTER TABLE t ADD INDEX covering_index (c3,c2);  
    
  3. c1 があなたの pk でない場合 (そして c2 でもない場合)、これを使用します。

    ALTER TABLE t ADD INDEX covering_index (c3,c2,c1);  
    
  4. c2 が PK の場合、これを使用します。

    ALTER TABLE t ADD INDEX covering_index (c3,c1);  
    
  5. ディスクの容量または挿入速度が問題になる場合は、ポイント インデックスを選択できます。いくらかのパフォーマンスを犠牲にしますが、挿入が重い場合は、適切なオプションになる可能性があります。

    ALTER TABLE t ADD INDEX a_point_index (c3);  
    
于 2012-10-24T14:28:31.053 に答える
7

検索する列にインデックスを作成するため、この場合、 field にインデックスを追加する必要がありますc3

CREATE INDEX c3_index ON t(c3)
于 2012-10-24T14:29:22.813 に答える