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

Usingtemporaryを使用してmysqlパフォーマンスの計画を説明します。 filesortの使用;インデックス条件の使用

    SHOW CREATE TABLEを入力してください 。

    メインフィルターは

    のようです
      where dsr_booking_date BETWEEN '2017-05-01' AND '2017-06-30' AND LENGTH(dsr_cnno)=9 AND DSR_BOOKED_BY ='F' AND dsr_status <>'R' AND dsr_cnno NOT LIKE'J %'AND dsr_cnno NOT LIKE' @%'AND dsr_cnno NOT LIKE' 576%'AND dsr_cnno NOT LIKE' I3%'AND dsr_cnno NOT LIKE' 7%'AND dsr_cnno NOT LIKE' N%'and d.dsr_dest_pin> 0  

    おそらく、そのための唯一の有用なインデックスは、次の順序です:

      INDEX(DSR_BOOKED_BY、dsr_booking_date) 

    のようなもの

      ifnull((select max(ndsr_ins_amt)from ndx_dsr_table where ndsr_cnno =dsr_cnno)、0)-ifnull((select max(ndsr_serv_charge)from ndx_dsr_table where ndsr_cnno =dsr_cnno)、0)- 

    おそらく一緒に行う必要があります。

    のようなものを考えてみてください
      ifnull(mm.max_nia)、0)-ifnull(mm.max_nsc)、0).... LEFT JOIN(SELECT max(ndsr_ins_amt)AS max_nia、max(ndsr_serv_charge)AS max_nsc from ndx_dsr_table)AS mm ON ndsr_cnno =dsr_cnno  

    または、必要に応じて、そのサブクエリを使用して一時テーブルを作成し、LEFTJOINします。

    (各列をそのテーブルで修飾していないため、これ以上具体的にすることはできません。)

    さまざまなJOINに適した「複合」インデックスがありますか ?

    EXPLAINによると 、 dsr_tableの182M行をスキャンしています 。したがって、上記の私のインデックスが役立つ可能性があります(同様のインデックスをまだ持っていない場合)。

    このような長いインデックスを提案することを躊躇しますが、これは役立つかもしれません:

      INDEX(DSR_BOOKED_BY、dsr_booking_date、-これらを最初に、この順序でdsr_cnno、dsr_status、dsr_cnno、dsr_dist_pin、-任意の順序でID)-(テーブルのPKが何であれ);最後 

    2番目のクエリの問題

      WHERE dsr_booking_date ='2017-04-30' AND '2017-05-30'  

    おそらくあなたは31日を意味しました:

      WHERE dsr_booking_date BETWEEN '2017-04-30' AND '2017-05-30'  

    または多分2日:

      WHERE dsr_booking_date IN( '2017-04-30'、 '2017-05-30') 

    あなたが持っているのは

      WHERE dsr_booking_date ='2017-04-30'-1日間のテストとtrue-これが'2017-05-30'の解釈方法です 



    1. postgreSQLmysqloracleの違い

    2. SQL Server(T-SQL)でのTRANSLATE()関数のしくみ

    3. PostgreSQLはどのようにUNIQUE制約を適用しますか/どのタイプのインデックスを使用しますか?

    4. MySQL-エンティティ:テーブル'TableDetails'の列'IsPrimaryKey'の値はDBNullです