2 つのテーブルからデータを収集し、それらを合計して、ケースの数と合計を表示するクエリを作成しました。
SELECT
count(ut.id) AS total
, ( SUM(internal_account) - SUM(( SELECT
SUM( ub.bill_summs )
FROM
u_billing ub
WHERE
ub.bill_types = 'correction'
AND ub.contract_id = ut.contract_id
)) ) AS summ
FROM
u_transactions ut
WHERE
ut.nulled = 0
AND ut.type = 'comission'
AND ut._status = 'not_paid'
AND DATE( ut.add_timestamp ) = DATE( '2012-05-11' );
しかし、それは本当に遅いです。テストケースでは、次の結果が得られました。
+-------+-------+
| total | summ |
+-------+-------+
| 182 | 15105 |
+-------+-------+
1 row in set (4.13 sec)
182 ケースで 1 日だけ 4.13 秒ですが、私のライブ サーバーには 60 万ケース以上あるため、これは非常に遅くなります。
パフォーマンスを向上させるためにクエリを書き直す方法はありますか?
再作成されたクエリを使用したソリューション:
DELETE FROM tmpContractSums;
INSERT INTO tmpContractSums
SELECT
ub.contract_id
, SUM( ub.bill_summs ) AS bill_summs
FROM
u_billing ub
WHERE
ub.bill_types = 'correction'
GROUP BY ub.contract_id;
SELECT
count(ut.id) AS total
, ( SUM(internal_account) - SUM(bill_summs) )
FROM
u_transactions ut
LEFT JOIN tmpContractSums t ON ut.contract_id = t.contract_id
WHERE
ut.nulled = 0
AND ut.type = 'comission'
AND ut._status = 'not_paid'
AND ut.add_timestamp BETWEEN '2012-05-11 00:00:00' AND '2012-05-11 23:59:59';
実行時間:500ms
PS: webuser でテーブルを削除できないため、テーブルを作成しました:
CREATE TABLE tmpContractSums AS SELECT contract_id, bill_summs FROM u_billing WHERE 1 = 0;
レコードを削除しています。ドロップほど速くはありませんが、それでもオリジナルよりははるかに高速です。