提高SELECT查询速度?
需要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
可以作出努力用连接创建一个单一的查询,并且确保你已经创建的列的索引。
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 – user622378 2011-04-08 10:44:42
@ user622378:当然,你必须编写显示数据的逻辑,如果你保持这3级嵌套循环,它总是需要时间 – 2011-04-08 10:50:54
请确保您有categories.takeawayID表的索引,items.category_id和item_options.item_id
这不会有很大的区别,而他有三层嵌套查询。 – 2011-04-08 10:36:04
但我读过索引会影响性能时添加和删除行?代理将每天在后端添加/编辑数据。 – user622378 2011-04-08 10:38:32
正确索引的性能下降对用户而言并不明显......您已经看到没有索引的情况下缓慢的事情会有多慢。你的三层嵌套查询导致了真正的问题,你应该修复它首先使用连接,但索引也将有所帮助 – 2011-04-08 12:18:25
有些事情要考虑 -
你可能不从任何表需要SELECT *
。只选择你需要的帮助。
另请考虑限制结果数量(如果需要,请使用分页),因为似乎不太可能需要一次输出15,000个项目。
不知道你的表结构,很难说如何,但你可以利用JOIN
而不是以这种方式循环访问大量数据。
停止在代码中的循环中执行子查询。您可以在连接项目和item_options的单个查询中返回主 - 细节信息。通过item_id对结果进行排序,以便在遍历新的item_id时转储出背景颜色更改。
一般提示:
- 使用
EXPLAIN
分析您的查询的效率有多高是 -
SELECT *
是低效的。只有SELECT
您需要的字段。 - 创建有问题的表中的字段的索引来提高速度
他们可以在单查询转换容易 – 2011-04-08 10:29:27
多少记录被显示? – SergeS 2011-04-08 10:30:05
@SergeS,共445个 – user622378 2011-04-08 10:33:24