mysql はジョイント インデックスを作成できます。 MySQL では、最大 16 カラムを含むジョイントインデックスを作成できます。作成方法は 2 つあります。 1. テーブル作成時に作成します。構文「CREATE TABLE テーブル名(カラム名 1 型 PRIMARY KEY、カラム名 2 型、カラム名)」 3 type, ...INDEX インデックス名(カラム名 2, カラム名 3...));"; 2. テーブルを変更する際に作成する構文「CREATE INDEX インデックス名 ON テーブル名(カラム名 2, カラム名)」 3、列名 4 );」。
このチュートリアルの動作環境: Windows7 システム、mysql8 バージョン、Dell G3 コンピューター。
ジョイントインデックスとは何ですか?結合インデックスの本質: 左端の一致
2 つ以上の列のインデックスは結合インデックスと呼ばれ、結合インデックスは複合インデックスとも呼ばれます。 MySQL では、ユーザーは最大 16 列を含む複合インデックスを作成できます。
複合インデックスの場合: Mysql はインデックス内のフィールドを左から右に使用します。クエリではインデックスの一部のみを使用できますが、左端の部分のみを使用できます。
たとえば、インデックスは key Index (a,b,c)
です。検索では a | a,b| a,b,c の 3 つの組み合わせをサポートできますが、 b,c はサポートされていません。検索を実行します。インデックスは、左端のフィールドが定数参照の場合に効率的です。
クエリ オプティマイザーは、インデックス内のすべての列をテストするクエリ、または最初の列、最初の 2 つの列などをテストするクエリに複合インデックスを使用します。
列がインデックス定義で正しい順序で指定されている場合、単一の複合インデックスにより、同じテーブルに対するこれらの種類のクエリを高速化できます。
テーブル作成時にジョイント インデックスを作成します。
構文:
CREATE TABLE 表名 ( c1 data_type PRIMARY KEY, c2 data_type, c3 data_type, c4 data_type, INDEX 索引名 (c2,c3,c4) );
この構文では、ジョイント インデックスは 3 つの列 c2、c3、c3 で構成されます。 c4.
テーブルの変更時に複合インデックスを作成する
次の CREATE INDEX ステートメントを使用して、既存のテーブルに複合インデックスを追加できます:
CREATE INDEX 索引名 ON 表名(c2,c3,c4);
(c1、c2、c3) に複合インデックスがある場合、次の組み合わせのいずれかで検索関数にインデックスを付けることになることに注意してください。
(c1) (c1,c2) (c1,c2,c3)
例:
SELECT * FROM table_name WHERE c1 = v1; SELECT * FROM table_name WHERE c1 = v1 AND c2 = v2; SELECT * FROM table_name WHERE c1 = v1 AND c2 = v2 AND c3 = v3;
If列がインデックスの左端のプレフィックスを形成していない場合、クエリ オプティマイザーはインデックスを使用して検索を実行できません。たとえば、次のクエリはコンポジットを使用して見つけることはできません:
SELECT * FROM table_name WHERE c1 = v1 AND c3 = v3;
MySQL Union Index Example
次のクエリは、コンポジットを使用して見つけることができません。サンプルデータベース。
次のステートメントは、lastName 列と firstName 列に結合インデックスを作成します。
CREATE INDEX name ON employees(lastName, firstName);
まず、名前インデックスを使用できます。 lastName 列はインデックスの左端のプレフィックスであるため、クエリ内で lastName 値を指定します。
2 番目に、名前インデックスを使用して、lastName 値と firstName 値の組み合わせの値をクエリできます。
名前インデックスは、次のクエリでの検索に使用されます:
1) 姓が Patterson である従業員を検索します
SELECT firstName, lastName, email FROM employees WHERE lastName = 'Patterson';
このクエリでは、次のクエリが使用されます。名前インデックス。インデックスの左端のプレフィックス (つまり、lastName 列) が検索に使用されるためです。
これを確認するには、EXPLAIN 経由でクエリに句を追加します。
EXPLAIN SELECT firstName, lastName, email FROM employees WHERE lastName = 'Patterson';
出力は次のとおりです。
2) 検索姓が Patterson、名が Steve の従業員:
SELECT firstName, lastName, email FROM employees WHERE lastName = 'Patterson' AND firstName = 'Steve';
このクエリでは、lastName 列と firstName 列の両方が検索に使用されるため、名前インデックスが使用されます。
確認してみましょう:
EXPLAIN SELECT firstName, lastName, email FROM employees WHERE lastName = 'Patterson' AND firstName = 'Steve';
出力は次のとおりです:
3) 姓がパターソン、名が の従業員を検索します。 Steve または Mary:
SELECT firstName, lastName, email FROM employees WHERE lastName = 'Patterson' AND (firstName = 'Steve' OR firstName = 'Mary');
このクエリは 2 番目のクエリと似ており、lastName 列と firstName 列の両方が検索に使用されます。
次のステートメントはインデックスの使用法を検証します:
EXPLAIN SELECT firstName, lastName, email FROM employees WHERE lastName = 'Patterson' AND (firstName = 'Steve' OR firstName = 'Mary');
出力は次のとおりです:
クエリ オプティマイザーは、次の検索に名前インデックスを使用できません。次のクエリ。 firstName がインデックスの左端のプレフィックスではない列のみが使用されるためです。
SELECT firstName, lastName, email FROM employees WHERE firstName = 'Leslie';
同様に、クエリ オプティマイザは、firstName または lastName が次のクエリの検索に名前インデックスを使用できません。列は検索に使用されます。
SELECT firstName, lastName, email FROM employees WHERE firstName = 'Anthony' OR lastName = 'Steve';
[関連する推奨事項: mysql ビデオ チュートリアル ]
以上がmysqlはジョイントインデックスを作成できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。