2011-04-08 104 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您需要的字段。
  • 创建有问题的表中的字段的索引来提高速度