1

統計を表示するテーブルにデータを入力しようとしています。次のクエリを使用して、キャンペーンIDのリストを配列に配置しました。

$query = "SELECT `id` FROM `c_templates` ORDER BY `id`";
$result = mysql_query($query) or die(mysql_error());
while($row = mysql_fetch_array($result)){
    $id[] = $row['id'];
}

すべてのIDを取得したら、foreachループを使用して、IDごとに5つのクエリを実行し、すべてのテーブルデータを収集します。

foreach($id as $i){
    // sent
    $query = "SELECT `template`, COUNT(*) as count FROM `s_log` WHERE `template` = '".$i."' AND `time_sent` BETWEEN '".$start."' AND '".$stop."'";
    $result = mysql_query($query) or die(mysql_error());
    while($row = mysql_fetch_array($result)){
        $template[] = $row['template'];
        $count[] = $row['count'];
    }

    // opens
    $query = "SELECT COUNT(*) as count FROM `t_opens` WHERE `campaign_id` = '".$i."' AND `timestamp` BETWEEN '".$start."' AND '".$stop."'";
    $result = mysql_query($query) or die(mysql_error());
    while($row = mysql_fetch_array($result)){
        $opens[] = $row['count'];
    }

    // clicks   
    $query = "SELECT `campaign_id`, COUNT(*) as count FROM `t_analytics` WHERE `campaign_id` = '".$i."' AND `timestamp` BETWEEN '".$start."' AND '".$stop."'";
    $result = mysql_query($query) or die(mysql_error());
    while($row = mysql_fetch_array($result)){
        $click_count[] = $row['count'];
    }

    // conversions
    $query = "SELECT `conversion_value`, COUNT(*) as count FROM `t_analytics` WHERE `campaign_id` = '".$i."' AND `timestamp` BETWEEN '".$start."' AND '".$stop."' AND `conversion_value` > 0";
    $result = mysql_query($query) or die(mysql_error());
    while($row = mysql_fetch_array($result)){
        $conversion_value[] = $row['conversion_value'];
        $conversion_count[] = $row['count'];
    }

    // bounce rate
    $query = "SELECT COUNT(*) AS `ck` FROM `s_log` WHERE `time_sent` BETWEEN '".$start."' AND '".$stop."' AND `status` = 'hardbounce' OR `status` = 'softbounce' AND `template` = '".$i."'";
    $result = mysql_query($query) or die(mysql_error());
    while($row = mysql_fetch_array($result)){
        $bounce_count[] = $row['ck'];
    }
}

問題は、このプロセスが40〜50を超えるidレコードを実行するのに4〜5秒かかることです。各クエリの後にタイマーを配置して、クエリが正しく実行されていることを確認しました。OPTIMIZEを実行し、すべてが適切にインデックス付けされていることを再確認しました。私が知る限り、問題はmysqlにはありません。

私が見つけた唯一のことは、各ループサイクルの後に.1〜.5秒の遅延があるということです。40〜50行を実行しようとすると、これは間違いなく合計され始めます。

私の質問:このデータをフェッチするためのより良い、より速い方法はありますか?プロセスをスピードアップするためにチェックすべき他の何かがありますか?

私が考えることができる唯一の解決策は、統計ごとに1つのクエリ(合計5つのクエリ)を実行して、すべてのデータをフェッチし、id後で表示するためにそれらを配列に配置することでした。それがどのようにできるのか、それが可能かどうかさえわかりません。私には、それぞれに対して個別のクエリを実行する必要があるように思われますがid、私は間違っていることを望んでいます。

どんな助けでも大歓迎です!!

4

0 に答える 0