如何优化mysql查询并减少服务器负载?

时间:2011-09-13 16:51:49

标签: php mysql join count mysqli

我的db表看起来像那样

第一张桌子 enter image description here

第二张表 - lastsrvc(上次服务信息)。 id列-uniques每个问题的autincremented id。 'cid'专栏 - 公司的ID。它是2个表之间的链接列:main和lastsrvc。

enter image description here

现在,我想要做的是,让我们说,计算公司1的所有问题。我的代码在1个查询之前发送并获取主表的所有行。然后为每个公司的行发送第二个查询。如果将来会有10 000家公司,我认为它会加载服务器。有没有办法发送1个查询而不是为每个公司发送查询(在while内)?是否有可能在使用COUNT之前,而不是在第二次查询时? Thx提前。

我的代码看起来像那样

    <?php
    $query=$db->query("SELECT * FROM main");
    while($row=$query->fetch_object())
    {?>
        <tr> 
        <td><?=$row->id;?></td>
        <td><?=$row->company;?></td>
        <td><?=$row->address;?></td>
        <td><?=$row->contact_name;?></td>
        <td><?=$row->contact_phone;?></td>
        <td><?php 
        if ($row->warr)
        {
            echo 'Var,'.$row->warr_year.' il';
        }
        else {
            echo 'Yoxdur';
            }
        ?></td>
        <td>
        <?php
        if ($query2=$db->query("SELECT * FROM lastsrvc WHERE cid='$row->id'"))
        echo $query2->num_rows;
        ?>
        </td>
        </tr>
<?php } ?>

3 个答案:

答案 0 :(得分:2)

做一个JOIN

SELECT main.etc, main.etc ..., COUNT(*) AS total
FROM main
LEFT JOIN lastsrvc ON main.id=lastsrvc.cid
GROUP BY main.id;

当数据变大时,使用分页来分割结果。
随着较大的HTML返回,浏览器也无法接受 (想象一下,超过10Mb的页面很难在浏览器中正确加载)


您还可以将结果存储到缓存中,例如存储到memcache中 缓存的好处是避免过度查询数据库

答案 1 :(得分:2)

将此作为您的顶级(且唯一)查询:

SELECT main.id, company, address, contact_name, contact_phone, COUNT(cid) as cnt
FROM main
LEFT JOIN lastsrvc ON main.id = lastsrvc.cid
GROUP BY main.id

使用连接的单个查询几乎总是比运行1 + n查询更有效。你像往常一样回应那个'cnt'字段:

<td><?php echo $row->cnt ?></td>

答案 2 :(得分:0)

添加到其他答案中,您还可以在您加入的列上设置索引并进行过滤,以便以后加快查询速度。

http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html