0

こんにちは、このコードを最適化するのに助けが必要です。現在、SQL クエリを実行するのに 38 秒、ビューとしてロードするのに 23 秒かかります。背景は次のとおりです - メンバーがリンクを使用したときにテーブル レコードをリダイレクトし、どこに行ったか、いつ戻ったか、どのステータスであるかを記録します。Projects テーブルは、必要なプロジェクトごとの情報を管理します。現在、レコードがリダイレクト テーブルに追加されるたびに更新されるプロジェクトごとのカウントを保持する 3 番目のテーブルがありますが、カウントは少し信頼できない場合があります。サーバーは 1 時間ごとにクエリを実行して、カウントを修正/検証します。

sum(if(xxx,1,0)) を使用せずに列を数える良い方法はありますか?

Select projects.ID as ID,cid,name as name,state as status,
                sum(if(status="complete",1,0)) as complete,cpc,
                cpc*ss as mmkingaku,
                cpc*sum(if(status="complete",1,0)) as total,
                sum(if(status="screenout",1,0)) as screenout,
                sum(if(status="quotafull",1,0)) as quotafull, 
                sum(if(status="short",1,0)) as short,
                sum(if(status="gate",1,0)) as gate,
                sum(if(status is null,1,0)) as empty,
                sum(if(status="complete",1,0))/(sum(if(status="complete",1,0))+sum(if(status="screenout",1,0)))*100 as IR
                from redirects,projects
                where redirects.rid=projects.rid and state<>"test" group by name order by cid desc
4

1 に答える 1

1

select通常、SQL のパフォーマンスは、節での計算によるものではありません。fromandgroup by句を確認する必要があります。

テーブルに適切なインデックスがありますか? redirects.ridprojects.rid、またはその両方に索引が必要です。実際、これらはおそらく と を含む複合インデックスである必要がありますstate(test適切な場合)。

これgroup byは、MySQL のパフォーマンスを著しく低下させる可能性があります。各テーブルにはどれくらいのデータがありますか?

于 2013-08-01T00:24:12.230 に答える