0

似たような質問が 1000 もあることは知っていますし、たくさん読みましたが、次のクエリのパフォーマンスを向上させる方法がわかりません。

SELECT DATE_FORMAT(c.date, "%d/%m/%Y") AS ddmmyy, c.idQualification, q.name,
SUM(idContactList = "") + COUNT( DISTINCT NULLIF( CONCAT( c.idContactList, c.idActivity ), "" ) ) AS numCalls

FROM callsBreakdown c
LEFT JOIN qualification q ON q.idQualification = c.idQualification
LEFT JOIN activityCampaign a ON (a.idActivity = c.idActivity)
LEFT JOIN qualificationCampaign qc ON (qc.idCampaign = a.idCampaign AND qc.idQualification = c.idQualification)

WHERE c.date BETWEEN "2011-01-01" AND "2012-10-01"
GROUP BY c.date, q.name 

日付範囲が広い場合 (1 年以上など)、クエリが完了するまでに 10 ~ 12 秒かかります。callBreakdown テーブルについての EXPLAIN で (他の列には Extra 列に "using index" があり、それらは迅速です):

id  select_type table type  possible_keys   key     key_len ref   rows    Extra
1   SIMPLE       c     ALL  date           NULL     NULL  NULL  379553  Using where; Using temporary; Using filesort

サーバーは日付インデックスを使用せず、一時テーブルとファイルソートが必要です。何か案が?ありがとう!

編集:エイリアス「date」を「ddmmyy」に変更しても、結果は同じです。エイリアスは問題ではありません。

編集 2: 日付範囲が 2 か月以下の場合、MySQL は「NULL」キーの代わりに日付インデックス (キー) を使用します

4

1 に答える 1

1

記述するときGROUP BY date は、関数呼び出しの出力であるエイリアスを使用します。

SELECT DATE_FORMAT(c.date, "%d/%m/%Y") AS date, ...

代わりに、元のテーブルの列でグループ化してみてください。これにより、ORDER BY でインデックスを使用できるようになります。

GROUP BY c.date, q.name
于 2012-12-19T09:54:34.503 に答える