[英]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>
除了其他答案之外,您還可以在要加入的列上設置索引並進行過濾,以便以后加快查詢速度。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.