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

MySQLインデックス使用クエリの最適化

    いくつかのこと...私は(a_id、job、state、start_time)

    に単一の複合インデックスを持っているでしょう

    これは、すべての基準でクエリを最適化するのに役立ちます。これは、最適に調整されたシーケンスであると私は信じています。単一の「A_ID」、次に2つのジョブ、小さな状態範囲、そして時間ベース。次に、引用符がないことに注意してください...数値を文字列の比較に変換していたようです。比較のために数値のままにしてください-文字列よりも高速です。

    また、それらすべてをインデックスの一部として持つことにより、COVERINGインデックスになります。つまり、生のページデータに移動して他の値を取得し、適格なレコードに含めるかどうかをテストする必要がありません。

    SELECT 
          count(*) AS tries 
       FROM 
          tasks
       WHERE 
              a_id = 614
          AND job IN ( 1, 3 ) 
          AND state > 80 AND state < 100 
          AND start_time >= 1386538013;
    

    さて、なぜインデックスが...次のシナリオを考えてみましょう。ボックスのある2つの部屋があります...最初の部屋では、各ボックスは「a_id」であり、その中には順番にジョブがあり、各ジョブには状態範囲があり、最後に開始時刻までです。

    別の部屋では、ボックスは開始時刻で並べ替えられ、そのa_id内で並べ替えられ、最後に状態になります。

    必要なものを見つけるのはどちらが簡単でしょう。それがあなたがインデックスについて考える方法です。 「A_ID=614」のボックスに移動してから、ジョブ1にジャンプし、ジョブ3のボックスにジャンプします。各ジョブ1、ジョブ3内で、80〜100を取得し、時間を取得します。ただし、各基準の考慮事項でデータと量をよく知っているので、調整することができます。

    最後に、count(ID)とcount(*)を比較します。私が気にかけているのは、レコードの資格だけです。フィルタリング基準がすでに含まれているかどうかとして認定されているため、実際のIDを知る必要はありません。なぜ(この場合)実際の「ID」を探すのですか。



    1. SQL Serverで無効になっているすべての外部キー制約を返す方法(T-SQLの例)

    2. 列数は行の値数と一致しませんが、一致します

    3. SQLServerExpressとExpresslocaldb

    4. mysqlPDOおよびストアドプロシージャの動的SQLインジェクション