mysqlマルチテーブルクエリーインスタンス結果および分析-2017.12.14


今日データを運営する時にsqlの実行速度が非常に遅いことを発見して、うん、前の編纂習慣に従って、それからアーキテクチャ師と一緒に分析して討論して、改善して、今記録して分析します
一、試験表、sql状況
set @bgDate = '20171213';
set @edDate = '20171213';

/*  ①*/
SELECT TA_ID,SUM(TB.amount),SUM(TB.fee) FROM
(SELECT ORDER_NO,TA_ID FROM Table_A  WHERE TA_STATUS = 100 AND TA_CHANNEL_MERCH_NO = '201712130001'
AND SETTLE_DATE <= @endDate AND SETTLE_DATE >= @begDate )TA
LEFT JOIN
(SELECT ORDER_NO,AMOUNT,fee FROM Table_B) TB
ON TA.ORDER_NO = TB.ORDER_NO
GROUP BY TA.TA_ID;

/*  ②*/
SELECT TA.`TA_ID` AS TA_ID , sum(TA.`AMOUNT`)  AS sumAmount , sum(TB.`fee`)   AS sumMerFee FROM 
`Table_A` TA 
LEFT JOIN 
`Table_B` TB 
ON TA.`ORDER_NO` = TB.`ORDER_NO`  
WHERE  TA.`SETTLE_DATE` >= @begDate AND TA.`SETTLE_DATE` <= @endDate
  AND TA.`TA_CHANNEL_MERCH_NO`='201712130001' 
  AND TA.`TA_STATUS`=100 
  GROUP BY TA.`TA_ID` 

/*         */
Table_A   :TA_ID、order_no、settle_date
Table_B   :order_no
/*          */
Table_A:10W+   
Table_B:10W+   

二、テスト結果
①90 sで結果が出た.
②1.5 sで結果が出る.
三、分析
1、navicat-解釈
番号1のTAは全表スキャンを行った.
2、自主分析
番号①sql
(1)テーブルデータ量は減少したが、一時テーブルTA、TBが新たに創設されたため、インデックスがなく、left joinでは速度が遅い.
(2)最後のグループbyの場合、TA.TA_IDにもインデックスがなく、再び速度を低下させる.
番号②sql
(1)TA,TBは直接全表left joinであるが,接続するorder_Noインデックスを作成しても、速度は保証されます.
(2)whereおよびgroupbyのフィールドの一部にインデックスが追加されています.