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

複数の結合でMySQLクエリを高速化するにはどうすればよいですか?

    次のことを試してみます:

    まず、次のテーブルと列にインデックスがあることを確認します(括弧内の列の各セットは個別のインデックスである必要があります):

    table1 : (subscribe, CDate)
             (CU_id)
    table2 : (O_cid)
             (O_ref)
    table3 : (I_oref)
             (I_pid)
    table4 : (P_id)
             (P_cat)
    table5 : (C_id, store)
    

    次に、 if 上記のインデックスを追加しても、期待したほど改善されませんでした。クエリを次のように書き直してみてください

    SELECT DISTINCT t1.first_name, t1.last_name, t1.email FROM
      (SELECT CU_id, t1.first_name, t1.last_name, t1.email
         FROM table1
         WHERE subscribe = 1 AND
               CDate >= $startDate AND
               CDate <= $endDate) AS t1
      INNER JOIN table2 AS t2
        ON t1.CU_id = t2.O_cid   
      INNER JOIN table3 AS t3
        ON t2.O_ref = t3.I_oref   
      INNER JOIN table4 AS t4
        ON t3.I_pid = t4.P_id   
      INNER JOIN (SELECT C_id FROM table5 WHERE store = 2) AS t5
        ON t4.P_cat = t5.C_id
    

    ここで、最初の副選択によって、結合の対象となる行数が大幅に削減され、後続の結合の作業が少なくなることを期待しています。表5の2番目のサブ選択の背後にある理由と同じです。

    いずれにせよ、それを台無しにします。つまり、最終的には単なるSELECTであり、実際に何も傷つけることはできません。それぞれの異なる順列によって生成された計画を調べて、それぞれの良い点と悪い点を見つけ出してください。

    共有してお楽しみください。



    1. エイリアスMySQLv8.0としてのユーザー定義変数が機能しない

    2. MySQLConverter'オブジェクトには、mysql-connectorで属性'_tuple_to_mysql'例外がありません

    3. TEXTまたはVARCHARを使用するのに適したDATATYPEはどれですか?

    4. データベース開発自動化のためのDevOpsソリューション