2012-12-17 11 views
5

私はmysqlの巨大なデータセットに問題があります。インデックスを作成する方法はたくさんあります。複数のインデックスを一緒に宣言すると、違いが何であるか教えてください。インデックスを一緒に宣言するか別々に宣言するか、違いは何ですか?

ALTER TABLE `db`.`test` ADD INDEX `someindex` (field1, field2, field3); 

別々に宣言するのではなく、

ALTER TABLE `db`.`test` ADD INDEX `f1` (field1), ADD INDEX `f2` (field2); 

なぜそれらをまとめて宣言したいのですか?

+0

最初のステートメントには1つのインデックスしか作成されていません。これはlast_name、first_name、initialに基づいて電話帳を検索するようなものです。 2番目のステートメントは、2つの電話帳のようになります.1つはlast_nameで、もう1つはfirst_nameによるブックです。 – Glenn

+0

[この質問の回答を参照してください。それは彼らのインデックスについて述べました。](http://stackoverflow.com/questions/13892952/database-schema-confusing-index-and-constraints) –

答えて

6

に詳細に説明されています。電話帳は、基本的に姓と名の索引です。したがって、並べ替えの順序は「列」が最初であることによって決まります。検索はいくつかのカテゴリに分類されます:

  1. 姓がスミスの人を検索すると、その本が姓でソートされているため、簡単に検索できます。
  2. 名前がJohnの人を探すと、電話帳はその本の中に散らばっているので、電話帳は役に立ちません。電話帳全体をスキャンする必要があります。
  3. 特定の姓のSmithと特定のファーストネームのJohnを検索すると、Smithが一緒にソートされていることがわかり、そのSmithsのグループ内でJohnsもソートされた順序で検索されます。

電話帳が名字でソートされている場合は、上記のケース#2と#3ではソートが役立ちますが、ケース#1ではサポートされません。

これは、正確な値を検索する場合について説明しますが、値の範囲を参照する場合はどうなりますか?あなたはファーストネームがJohnで、最後の名前が 'S'(Smith、Saunders、Staunton、Shermanなど)で始まるすべての人物を探したかったとします。ジョンはそれぞれの姓の中でJの下でソートされますが、すべてのジョンをSで始まるすべての姓にしたい場合、ジョンは一緒にグループ化されません。彼らは再び散在しているので、最後に「S」で始まるすべての名前をスキャンする必要があります。一方、電話帳が名字で構成されていた場合は、すべてのJohnsを一緒に見つけて、Johns内でSのすべての姓をグループ化します。

したがって、複数列インデックスの列の順序は重要です。 1つのタイプの問合せでは、索引に対して特定の列順序が必要な場合があります。いくつかのタイプのクエリがある場合は、それらを支援するために複数のインデックスが必要な場合があります。

詳細および例については、私のプレゼンテーションHow to Design Indexes, Reallyを参照してください。または、私のプレゼンテーションをvideoで見てください。

1

データベースでは通常、クエリごとに1つのインデックスしか使用できないため、3つのカラムがすべて 'where'句にあると仮定すると、単一の複合インデックスが必要になります。

しかし、複合インデックスは左から右に部分的にしか使用できないので、たとえばfield1だけで別のクエリを使用すると、複合インデックスは引き続き使用されます。しかし、where句でfield2のみを使用するクエリの場合、そのインデックスは使用できません。フィールド2またはフィールド2で始まる化合物であるインデックスが必要です。

これは私がMySQLのトレーニングクラスを教え、そしてマルチカラムインデックスを議論するとき、私は電話帳にアナロジーを使用し、[MySQLのドキュメント]

関連する問題