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

インデックスが強制された場合にのみ使用され、デフォルトでは使用されないのはなぜですか?

    パフォーマンスを向上させるには、where句に含まれる列に基づいて複合インデックスを使用してみてください。
    IN句の内容が固定値のセットであると仮定して、内部結合のIN句を変更してみてください。
    ユニオン(または必要な値を持つ新しいテーブル)を使用できます

    例:ユニオンを使用する(IN句がサブクエリの場合は同様のことができます)

    select user_table.colA ,ColB , count(*) as count 
    from user_table 
    INNER JOIN  ( 
      select 'FIXED1' colA
      union
      select 'FIXED2'
      ....
      union 
      select 'FIXEDX'
      )  t on t.colA = user_table.colA  
    where colC >='2019-09-01 00:00:00' 
          and ColB = 17  
    group by colA ,ColB;
    

    列のテーブルuser_tableに複合インデックスを追加することもできます

       colA, colB, colC
    

    mysqlクエリオプティマイザが使用する要素に関連するものについては、そこで使用するインデックスを決定し、これらすべてについて、クエリオプティマイザはコストを割り当てます
    考慮すべき事項

    • Where句に含まれる列
    • テーブルのサイズ(結合されているテーブルのサイズではありません)
    • フェッチされる行数の見積もり(インデックスを使用するか、単にテーブルをスキャンするかを決定するため)
    • jionの列とwhere句のデータ型が一致するかどうか
    • 照合の誤解を含む関数またはデータ型変換の使用
    • インデックスのサイズ
    • インデックスのカーディナリティ

    そして、これらすべてのオプションについてコストが評価され、これがインデックスの選択につながります

    あなたの場合、日付としてのcolCはデータ変換を意味する可能性があり(リテラル値を文字列として尊重します)、この場合、インデックスは選択されません..

    このために、変換されていない値に関連する左端の列を持つ複合インデックスを提案しました



    1. それぞれの一意の値とカウントを取得する

    2. OracleSQL-構文/キーワードの結合

    3. Oracleがデータベーステーブルの行にNaNを追加するのはいつ/なぜですか

    4. mysqlでのリレーショナルテーブルの作成