簡體   English   中英

如何優化MySQL查詢並減少服務器負載?

[英]How to optimize MySQL queries and decrease server load?

我的db表看起來像那樣

第一張表:

在此輸入圖像描述

第二個表 - lastsrvc(上次服務信息)。 id列 - 每個問題的單獨自動遞增ID。 'cid'專欄 - 公司的ID。 它是2個表之間的鏈接列:main和lastsrvc。

在此輸入圖像描述

現在,我想要做的是,讓我們說,計算公司1的所有問題。我的代碼在1次查詢之前發送並獲取主表的所有行。 然后為每個公司的行發送第二個查詢。

如果將來會有10 000家公司,我認為它會加載服務器。 有沒有辦法發送1個查詢而不是為每個公司發送查詢(在while內)? 是否有可能在使用COUNT之前,而不是在第二次查詢時?

我的代碼看起來像那樣

    <?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 } ?>

做一個加入

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中。
緩存的好處是避免過度查詢數據庫

將此作為您的頂級(且唯一)查詢:

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>

除了其他答案之外,您還可以在要加入的列上設置索引並進行過濾,以便以后加快查詢速度。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM