2011-04-08 179 views
1

需要40秒才能在瀏覽器上顯示數據,這是不可接受的。提高SELECT查詢速度?

下面的代碼,它顯示所有從category.takeawayID = xxxxx和項目和選項表中循環。

類別表:超過15,000行總

項目表:超過10萬行

item_options表:超過15萬行。

如何提高性能?

$qcat = mysql_query("select * from categories where takeawayID=55276"); 
while($c_row = mysql_fetch_assoc($qcat)) 
{ 
    echo "<h2>" . $c_row['name'] . "</h2>"; 
    echo "<div>" . $c_row['description'] . "</div><br /> <br />"; 

    $qitem = mysql_query("select * from items where category_id =". $c_row['id']); 

     while($i_row = mysql_fetch_assoc($qitem)) { 
      echo "<div style='backround-color:pink'>" . $i_row['name'] . "</div>"; 

      $qoption = mysql_query("select * from item_options where item_id =". $i_row['id']); 

      while($o_row = mysql_fetch_assoc($qoption)) { 
       echo " (" . $o_row['price'] . ") "; 
      } 
     } 
} 

最高記錄200到500行之間顯示取決於takeawayID ID

+1

他們可以在單查詢轉換容易 – 2011-04-08 10:29:27

+0

多少記錄被顯示? – SergeS 2011-04-08 10:30:05

+0

@SergeS,共445個 – user622378 2011-04-08 10:33:24

回答

5

可以作出努力用連接創建一個單一的查詢,並且確保你已經創建的列的索引。

select * from categories c 
left join items t 
on c.id= t.category_id 
left join item_options io 
on t.id=io.item_id 
Where c.takeawayID=55276 
+0

但是,如何分隔類別名稱和項目名稱以及佈局視圖的選項價格?選項和項目可以有多個1 – user622378 2011-04-08 10:44:42

+2

@ user622378:當然,你必須編寫顯示數據的邏輯,如果你保持這3級嵌套循環,它總是需要時間 – 2011-04-08 10:50:54

1

請確保您有categories.takeawayID表的索引,items.category_id和item_options.item_id

+0

這不會有很大的區別,而他有三層嵌套查詢。 – 2011-04-08 10:36:04

+0

但我讀過索引會影響性能時添加和刪除行?代理將每天在後端添加/編輯數據。 – user622378 2011-04-08 10:38:32

+0

正確索引的性能下降對用戶而言並不明顯......您已經看到沒有索引的情況下緩慢的事情會有多慢。你的三層嵌套查詢導致了真正的問題,你應該修復它首先使用連接,但索引也將有所幫助 – 2011-04-08 12:18:25

0

有些事情要考慮 -

你可能不從任何表需要SELECT * 。只選擇你需要的幫助。

另請考慮限制結果數量(如果需要,請使用分頁),因爲似乎不太可能需要一次輸出15,000個項目。

不知道你的表結構,很難說如何,但你可以利用JOIN而不是以這種方式循環訪問大量數據。

0

停止在代碼中的循環中執行子查詢。您可以在連接項目和item_options的單個查詢中返回主 - 細節信息。通過item_id對結果進行排序,以便在遍歷新的item_id時轉儲出背景顏色更改。

2

一般提示:

  • 使用EXPLAIN分析您的查詢的效率有多高是
  • SELECT *是低效的。只有SELECT您需要的字段。
  • 創建有問題的表中的字段的索引來提高速度