mysqlマルチテーブルクエリーインスタンス結果および分析-2017.12.14
今日データを運営する時にsqlの実行速度が非常に遅いことを発見して、うん、前の編纂習慣に従って、それからアーキテクチャ師と一緒に分析して討論して、改善して、今記録して分析します
一、試験表、sql状況
二、テスト結果
①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のフィールドの一部にインデックスが追加されています.
一、試験表、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のフィールドの一部にインデックスが追加されています.