mysqlはジョイントインデックスを作成できますか?

青灯夜游
リリース: 2022-06-15 16:22:42
オリジナル
5948 人が閲覧しました

mysql はジョイント インデックスを作成できます。 MySQL では、最大 16 カラムを含むジョイントインデックスを作成できます。作成方法は 2 つあります。 1. テーブル作成時に作成します。構文「CREATE TABLE テーブル名(カラム名 1 型 PRIMARY KEY、カラム名 2 型、カラム名)」 3 type, ...INDEX インデックス名(カラム名 2, カラム名 3...));"; 2. テーブルを変更する際に作成する構文「CREATE INDEX インデックス名 ON テーブル名(カラム名 2, カラム名)」 3、列名 4 );」。

mysqlはジョイントインデックスを作成できますか?

このチュートリアルの動作環境: 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

次のクエリは、コンポジットを使用して見つけることができません。サンプルデータベース。

mysqlはジョイントインデックスを作成できますか?

次のステートメントは、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';
ログイン後にコピー

出力は次のとおりです。

mysqlはジョイントインデックスを作成できますか?

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';
ログイン後にコピー

出力は次のとおりです:

mysqlはジョイントインデックスを作成できますか?

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');
ログイン後にコピー

出力は次のとおりです:

mysqlはジョイントインデックスを作成できますか?

クエリ オプティマイザーは、次の検索に名前インデックスを使用できません。次のクエリ。 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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート