在浏览器上显示数据需要40秒,这是不可接受的。
下面的代码,它显示了category.takeawayID = xxxxx中的所有内容以及项目和选项表中的循环。
类别表:总计超过15,000行
项目表:超过100,000行
item_options表:超过150,000行。
如何提高性能?
$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
答案 0 :(得分: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
答案 1 :(得分:2)
一般提示:
EXPLAIN
来分析您的查询效率SELECT *
效率低下。只有SELECT
您需要的字段。答案 2 :(得分:1)
确保您在categories.takeawayID,items.category_id和item_options.item_id
上有表索引答案 3 :(得分:0)
需要考虑的一些事项 -
您可能不需要从任何表格SELECT *
。只选择您需要的帮助。
还要考虑限制结果数量(如果需要,请使用分页),因为您似乎不太可能一次性输出15,000个项目。
在不知道你的表结构的情况下,很难说如何,但你可以利用JOIN
而不是以这种方式循环大量数据。
答案 4 :(得分:0)
停止在代码中的循环中执行子查询。您可以在连接items和item_options的单个查询中返回主 - 详细信息。按item_id对结果进行排序,以便在遍历新的item_id时可以转出背景颜色更改。