2010-08-05 42 views
3

鉴于数据库中有5,000个记录获取ID,您认为哪个查询更快?查询优化:哪种SELECT语法更快?

  1. 遍历使用PHP,并执行为每一个SELECT查询5000点的ID,

    foreach($ids as $id){ 
        // do the query 
        $r = mysql_query("SELECT * FROM TABLE WHERE ID = {$id}"); 
    } 
    
  2. 或收集阵列中的所有的ID,并使用SELECT * FROM TABLE WHERE ID IN(1向上到5000)

    //assuming $ids = array(1,2 ---- up to 5000); 
    $r = mysql_query("SELECT * FROM TABLE WHERE ID IN (".join(",",$ids).")"); 
    
+1

你测试了它......? – deceze 2010-08-05 08:41:01

+6

这是特定于MySQL吗?创建一个表,填充它,然后测量。数据胜过观点。 – Manfred 2010-08-05 08:41:48

+2

@ 0xA3令人惊叹的评论。 – 2010-08-05 08:52:56

回答

4

没有疑问的影子,一次加载它们会更快。运行5,000个查询会慢很多,因为每个查询都会带来一定的开销。

此外,为了加快速度,请勿使用*运算符!选择要使用的字段,如果您只需要ID列,请指定该字段!如果您想要所有列,请全部指定它们,因为您稍后可以添加字段并且不需要检索此新字段。

+2

+1但要小心构造的查询字符串的长度。与“IN”建筑,你可以达到最大长度。此外,加入$ ids可能会导致SQL注入漏洞。 尝试为每个id使用mysql_real_escape_string()。 – ThinkJet 2010-08-05 12:09:13

4

选项2是肯定会更快。 5000个单独的数据库查询将有巨大的网络连接开销。

0

当然要衡量它,但我肯定会建议让数据库完成这项工作。 一切都依赖,我希望你没有为每个呼叫创建一个连接。

2

最快的方法是根本不要求5000行。
你几乎不需要100在一个页面上显示它们。 5000是过度冲击

+1

完全取决于页面的目的,这不是一个真正的答案。 – 2010-08-05 09:41:12

0

如果您使用绑定变量使用查询语句,循环速度会更快。宣布声明离开循环;然后在循环内部绑定每个id的变量。

不要低估进入SQL解析的时间;特别是在这些漫长的事情上。

0

选项2更快。使用选项1,每次迭代都会为服务器执行完整的roundtrim。

我会指出,在这种情况下,您可能会考虑使用分页来显示数据。

提示:测量,测量,测量。使用您的时间10分钟的代码,您将立即得到答案。

0

对许多查询,速度更快?
尝试测量它是这样的例子:

<?php 
    $start = getmicrotime(); 
    for ($i=0;$i<100000;$i++) 
    { 
      foreach($ids as $id){ 
       // do the query 
       $r = mysql_query("SELECT * FROM TABLE WHERE ID = {$id}"); 
      } 

    } 
    $end = getmicrotime(); 
    echo 'Time (1): '.($end- $start).' sec'; 



    $start = getmicrotime(); 
    for ($i=0;$i<100000;$i++) 
    { 
      //assuming $ids = array(1,2 ---- up to 5000); 
      $r = mysql_query("SELECT * FROM TABLE WHERE ID IN (".join(",",$ids).")"); 
    } 
    $end = getmicrotime(); 
    echo 'Time (2): '.($end- $start).' sec'; 
?> 
+0

你的测试毫无用处 – 2010-08-05 09:50:08