提高SELECT查询速度?

时间:2011-04-08 10:28:09

标签: php mysql

在浏览器上显示数据需要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

5 个答案:

答案 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时可以转出背景颜色更改。