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'の解釈方法です