如何使这个MySQL Count查询更有效?

时间:2011-05-19 00:27:37

标签: php mysql count

//get the current member count
$sql = ("SELECT count(member_id) as total_members from exp_members");
$result = mysql_query($sql) or die(mysql_error());
$num_rows = mysql_num_rows($result);
if ($num_rows != 0) {
    while($row = mysql_fetch_array($result)) {
        $total_members = $row['total_members'];
    }
}

//get list of products
$sql = ("SELECT m_field_id, m_field_label from exp_member_fields where m_field_name like 'cf_member_ap_%' order by m_field_id asc");
$result = mysql_query($sql) or die(mysql_error());
$num_rows = mysql_num_rows($result);

if ($num_rows != 0) {

    while($row = mysql_fetch_array($result)) {

        $m_field_id             = $row['m_field_id'];
        $m_field_label          = $row['m_field_label'];

        $sql2 = ("SELECT count(m_field_id_".$m_field_id.") as count from exp_member_data where m_field_id_".$m_field_id." = 'y'");
        $result2 = mysql_query($sql2) or die(mysql_error());
        $num_rows2 = mysql_num_rows($result2);

        if ($num_rows2 != 0) {
            while($row2 = mysql_fetch_array($result2)) {
                $p = ($row2['count']/$total_members)*100;
                $n = $row2['count'];
                $out .= '<tr><td>'.$m_field_label.'</td><td>'.number_format($p,1).'%</td><td>'.$n.'</td></tr>';
            }
        }

    }


}

3 个答案:

答案 0 :(得分:2)

如果您可以用非代码术语描述您想要完成的任务,那么帮助会更容易。但问题的一个指标是在一个查询的行中看到一个php循环,并为每一行执行另一个查询。

有多种方法可以查询小计。但是如果你能解释一下这个目标会更容易解释。

答案 1 :(得分:1)

计数查询总是会返回1行,所以你不需要循环

$sql = ("SELECT count(member_id) as total_members from exp_members");
$result = mysql_query($sql) or die(mysql_error());
$row = mysql_fetch_array($result);
$total_members = $row['total_members'];

除此之外,我不知道你怎么能做得更好。您可以对两个计数查询执行相同的操作。

由于这些是直接查询,我现在认为任何瓶颈都会出现在MySQL端

答案 2 :(得分:1)

第一个COUNT个查询(“获取当前成员数”)应该几乎立即执行。

第二个查询(“获取产品列表”)可能会很慢,具体取决于您的索引。您正在查询m_field_name,然后在m_field_id上进行排序,因此您可能需要两者的综合索引。

第三个查询,重复执行(每个产品一次),查询m_field_id_*(即任何可能的字段),所以你应该确保它们被编入索引。

总之,您需要a)找出哪个查询运行缓慢,b)索引需要编制索引的内容,以及c)尽可能组合查询。

相关问题