sql >> データベース >  >> RDS >> Mysql

MySQLで多対多接続のリンクテーブルに適切にインデックスを付ける方法は?

    検索方法によって異なります。

    このように検索した場合:

    /* Given a value from table1, find all related values from table2 */
    SELECT *
    FROM table1 t1
    JOIN table_table tt ON (tt.table_1 = t1.id)
    JOIN table2 t2 ON (t2.id = tt.table_2)
    WHERE t1.id = @id
    

    次に必要なもの:

    ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 (table_1, table_2)
    

    この場合、table1 NESTED LOOPSでリードします インデックスはtable1の場合にのみ使用できます 最初にインデックスが作成されます。

    このように検索した場合:

    /* Given a value from table2, find all related values from table1 */
    SELECT *
    FROM table2 t2
    JOIN table_table tt ON (tt.table_2 = t2.id)
    JOIN table1 t1 ON (t1.id = tt.table_1)
    WHERE t2.id = @id
    

    次に必要なもの:

    ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 (table_2, table_1)
    

    上記の理由で。

    ここでは独立したインデックスは必要ありません。複合インデックスは、最初の列のプレーンインデックスを使用できるすべての場所で使用できます。独立したインデックスを使用すると、両方の値を効率的に検索できなくなります。

    /* Check if relationship exists between two given values */
    SELECT 1
    FROM table_table
    WHERE table_1 = @id1
      AND table_2 = @id2
    

    このようなクエリの場合、両方の列に少なくとも1つのインデックスが必要です。

    2番目のフィールドに追加のインデックスがあることは決して悪いことではありません:

    ALTER TABLE table_table ADD CONSTRAINT pk_table1_table2 PRIMARY KEY (table_1, table_2)
    CREATE INDEX ix_table2 ON table_table (table_2)
    

    主キーは、on both valuesに使用されます table_1の値に基づく検索の場合 、table_2の値に基づく検索には追加のインデックスが使用されます 。



    1. 親テーブルと子テーブルからの行の削除

    2. WITH句を使用したクエリでPostgresにFROM句のエントリエラーがありません

    3. 値が現在の値より大きい場合のMySQLの更新

    4. Oracleでテーブルを作成する方法