11

私はmysqlの巨大なデータセットに問題があり、インデックスを作成するためのさまざまな方法を模索しています。複数のインデックスを一緒に宣言した場合の違いは誰か教えてもらえますか

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

それらを別々に宣言するのではなく?

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

なぜそれらを一緒にまたは別々に宣言したいのですか?

4

2 に答える 2

12

私はMySQLトレーニングクラスを教えており、複数列のインデックスについて議論するときは、電話帳との類似性を使用します。電話帳は基本的に、名前、次に名のインデックスです。したがって、ソート順は、どの「列」が最初であるかによって決定されます。検索はいくつかのカテゴリに分類されます。

  1. 家系の名前がスミスの人を検索すると、本が名前でソートされているため、簡単に見つけることができます。
  2. If you look up people whose first name is John, the telephone book doesn't help because the Johns are scattered throughout the book. You have to scan the whole telephone book to find them all.
  3. If you look up people with a specific last name Smith and a specific first name John, the book helps because you find the Smiths sorted together, and within that group of Smiths, the Johns are also found in sorted order.

If you had a telephone book sorted by first name then by last name, the sorting of the book would assist you in the above cases #2 and #3, but not case #1.

これは正確な値を検索する場合を説明していますが、値の範囲で検索する場合はどうでしょうか。名がジョンで、名前が「S」で始まるすべての人(Smith、Saunders、Staunton、Shermanなど)を検索するとします。ジョンは各姓の中でJの下にソートされますが、Sで始まるすべての姓のすべてのジョンが必要な場合、ジョンはグループ化されません。それらは再び散らばっているので、最後の名前が「S」で始まるすべての名前をスキャンする必要があります。一方、電話帳が名、名前の順に整理されている場合は、すべてのジョンが一緒に表示され、ジョン内では、すべてのSの名前がグループ化されます。

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

詳細と例については、私のプレゼンテーション「インデックスの設計方法」を参照してください。または、ビデオで私のプレゼンテーションをご覧ください。


単一列のインデックスと複数列のインデックスをいつ使用するかを明確にするために、電話帳を使用して、姓と名の組み合わせで人を検索するかどうかを検討してください。たとえば、「サラ・スミス」。

2つの電話帳があり、1つは名前で整理され、もう1つは名で整理されている場合、名前の本で「Smith」を検索し、名前の本で「Sarah」を検索して、2つの交差点を見つけることができます。結果。MySQLは、インデックスマージアルゴリズムを使用してこれを実行しようとすることがあります。

実際の電話帳のように、名前と名の両方でソートされている場合は、1つのインデックスを検索することをお勧めします。次に、検索で「Smiths」の本のサブセットが検索され、そのサブセット内で、サブセットが名でソートされているため、「Sarahs」を効率的に検索できます。

于 2012-12-17T01:55:26.623 に答える
2

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

ただし、複合インデックスは左から右に部分的にしか使用できないため、たとえばfield1だけに別のクエリがある場合でも、複合インデックスは引き続き使用されます。ただし、「where」句にfield2のみが含まれるクエリの場合、そのインデックスは使用できません。field2のすぐ上にあるインデックス、または複合であるがfield2で始まるインデックスが必要になります。

これについては、[MySQLドキュメント]で詳しく説明されています。

于 2012-12-17T01:13:35.143 に答える