【问题标题】:Query optimization : Which SELECT syntax is faster?查询优化:哪种 SELECT 语法更快?
【发布时间】:2011-03-25 16:33:25
【问题描述】:

鉴于在数据库中获取 5,000 个 ID 的记录,您认为哪个查询更快?

  1. 使用 php 循环遍历 5000 个 ID,并为每个 ID 执行 SELECT 查询,

    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).")");
    

【问题讨论】:

  • 这是 MySQL 特有的吗?创建一个表,填充它,然后测量。数据胜过舆论。
  • 您能否提供有关表结构的更多信息:索引...?

标签: php sql mysql optimization


【解决方案1】:

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

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

【讨论】:

  • +1 但要注意构造查询字符串的长度。使用“IN”结构,您可以达到最大长度。此外,$ids 的加入会受到 SQL 注入漏洞的影响。尝试对每个 id 使用 mysql_real_escape_string()。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    最快的方法是根本不请求 5000 行。
    您几乎不需要 100 就可以在一页上显示它们。 5000 太夸张了

    【讨论】:

    • 完全取决于页面的用途,这不是真正的答案。
    【解决方案4】:

    当然要衡量它,但我当然建议让数据库来完成这项工作。 一切都取决于,但我希望您不要为每个呼叫创建连接。

    【讨论】:

      【解决方案5】:

      如果您使用带有绑定变量的查询语句,则循环会更快。在循环中声明语句;然后在循环内部为每个 id 绑定变量。

      不要低估进入 SQL 解析的时间;尤其是在这些冗长的事情上。

      【讨论】:

        【解决方案6】:

        选项 2 更快。使用选项 1,您可以为每次迭代对服务器进行一次完整的舍入。

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

        提示:测量,测量,测量。只需花费 10 分钟的时间编写代码,您就会立即得到答案。

        【讨论】:

          【解决方案7】:

          对于许多查询,哪个更快?
          尝试像这样测量它:

          <?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';
          ?>
          

          【讨论】:

            猜你喜欢
            • 2011-12-15
            • 2013-12-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-12-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多