Php 如何使MySQL计数查询更高效? //获取当前成员计数 $sql=(“从exp_成员中选择计数(成员id)作为成员总数”); $result=mysql\u query($sql)或die(mysql\u error()); $num\u rows=mysql\u num\u rows($result); 如果($num_rows!=0){ while($row=mysql\u fetch\u数组($result)){ $total_members=$row['total_members']; } } //获取产品列表 $sql=(“从exp_成员_字段中选择m_字段_id、m_字段_标签,其中m_字段_名称如'cf_成员_ap_%'按m_字段_id asc排序”); $result=mysql\u query($sql)或die(mysql\u error()); $num\u rows=mysql\u num\u rows($result); 如果($num_rows!=0){ while($row=mysql\u fetch\u数组($result)){ $m_field_id=$row['m_field_id']; $m_field_label=$row['m_field_label']; $sql2=(“选择count(m_field_id...$m_field_id.”)作为exp_成员_数据的计数,其中m_field_id...$m_field_id...'y'); $result2=mysql\u query($sql2)或die(mysql\u error()); $num_rows2=mysql_num_rows($result2); 如果($num_rows2!=0){ 而($row2=mysql\u fetch\u数组($result2)){ $p=($row2['count']/$total_成员)*100; $n=$row2['count']; $out.=''.$m_字段_标签'.'.number_格式($p,1)。'%'.$n'; } } } }

Php 如何使MySQL计数查询更高效? //获取当前成员计数 $sql=(“从exp_成员中选择计数(成员id)作为成员总数”); $result=mysql\u query($sql)或die(mysql\u error()); $num\u rows=mysql\u num\u rows($result); 如果($num_rows!=0){ while($row=mysql\u fetch\u数组($result)){ $total_members=$row['total_members']; } } //获取产品列表 $sql=(“从exp_成员_字段中选择m_字段_id、m_字段_标签,其中m_字段_名称如'cf_成员_ap_%'按m_字段_id asc排序”); $result=mysql\u query($sql)或die(mysql\u error()); $num\u rows=mysql\u num\u rows($result); 如果($num_rows!=0){ while($row=mysql\u fetch\u数组($result)){ $m_field_id=$row['m_field_id']; $m_field_label=$row['m_field_label']; $sql2=(“选择count(m_field_id...$m_field_id.”)作为exp_成员_数据的计数,其中m_field_id...$m_field_id...'y'); $result2=mysql\u query($sql2)或die(mysql\u error()); $num_rows2=mysql_num_rows($result2); 如果($num_rows2!=0){ 而($row2=mysql\u fetch\u数组($result2)){ $p=($row2['count']/$total_成员)*100; $n=$row2['count']; $out.=''.$m_字段_标签'.'.number_格式($p,1)。'%'.$n'; } } } },php,mysql,count,Php,Mysql,Count,计数查询将始终返回1行,因此不需要循环 //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 = my

计数查询将始终返回1行,因此不需要循环

//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>';
            }
        }

    }


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

由于这些都是直截了当的查询,我想现在任何瓶颈都会出现在MySQL端

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

第二个查询(“获取产品列表”)可能会很慢,具体取决于您的索引。您正在查询
m\u field\u name
,然后在
m\u field\u id
上排序,因此您可能需要这两个索引的组合索引

第三个查询是重复执行的(每个产品一次),查询
m\u field\u id.*
(即许多可能的字段中的任何一个),因此您可能应该确保对它们进行索引


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

如果您可以用非代码术语描述您试图完成的任务,那么就更容易提供帮助。但问题的一个指标是,在一个查询的行上看到一个php循环,每行执行另一个查询


有很多方法可以查询小计。但是如果你能稍微解释一下目标,解释起来就容易多了。

你的表定义(包括索引)是什么?我想我想做得更好的部分是获取产品列表,然后对每个产品运行一个查询,以获取该产品列中“y”的用户数。就其本身而言,它运行得并不慢,这很好,我们正在缓存结果。我只是想知道是否可以降低系统的强度。基本上,在exp_member_数据表中,我们有带有member_id的行,显然每个成员有一行。大约有30万名成员。在同一个表中,每个产品都有一列。如果单元格不使用或确实使用产品,则会显示“n”或“y”。产品名称位于名为exp_member_fields的表中。此表中的每一行表示一个自定义成员字段。因此,我想从该表中获取表示产品的所有行的唯一ID(X)和产品标签,然后从exp_member_数据表中获取带有“y”的行数,其中列(m_field_ID_X)与exp_member_fields表中的行ID相关。任何查询中都没有m_field_ID_*星号(*)是“通配符”或“匹配任何内容”的常用缩写。您的查询中有:m\u field\u id\u$m\u field\u id
$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'];