【问题标题】:MySQL: "The SELECT would examine more than MAX_JOIN_SIZE rows"MySQL:“SELECT 将检查超过 MAX_JOIN_SIZE 行”
【发布时间】:2010-10-30 21:57:45
【问题描述】:

我正在使用 PHP 和 MySQL。在我的程序中有一个涉及连接的选择查询。当我在本地主机上运行它时,它工作正常,但是当我将它上传到我的服务器上并尝试执行它时,它会生成以下错误:

The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET SQL_MAX_JOIN_SIZE=# if the SELECT is okay

我该如何纠正这个问题?

【问题讨论】:

  • 我们服务器上的 SELECT @@MAX_JOIN_SIZE 的值是多少?选择@@MAX_JOIN_SIZE;可能是不合理的低,或者您的查询可能......次优。
  • 这个问题的好答案在这里:stackoverflow.com/a/950576/325365

标签: sql mysql join


【解决方案1】:

如果您使用 PDO 驱动程序,请在构造新数据库句柄时在 driver_options 数组中设置 PDO::MYSQL_ATTR_INIT_COMMAND

像这样:

$dbh = new PDO('mysql:host=xxx;port=xxx;dbname=xxx', 'xxx', 'xxx', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET SESSION SQL_BIG_SELECTS=1'));

【讨论】:

    【解决方案2】:

    对我来说,解决方案是为所有用于匹配连接的列添加索引键。

    【讨论】:

      【解决方案3】:

      使用 PHP 时,SQL_BIG_SELECTS=1 应在主查询之前的单独查询中设置。例如:

      $mysqli = new mysqli("localhost", "root", "password", "db"); 
      
      $mysqli->query("SET SQL_BIG_SELECTS=1");  //Set it before your main query
      
      $results = $mysqli->query("SELECT a, b, c FROM test");
      while($row = $results->fetch_assoc()){
          echo '<pre>';
          print_r ($row);
          echo '</pre>';
      }
      

      【讨论】:

        【解决方案4】:

        我遇到了同样的问题。它是一个 drupal 网站,所以它倒下也就不足为奇了。

        这是一个老式查询,即Select blah From table1, table2, table3 Where table1.id=table2.id And table2.some = 'thing'

        就像@VolkerK 所说,解决方案是将过滤 table2 结果的 where 子句移到将 table1 匹配到 table2 的 where 子句(实际上是连接子句),从而减少需要在 table2 中匹配到 table1 的记录数量。

        【讨论】:

          【解决方案5】:

          参数的效果记录在http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_max_join_size

          您应该更严格地过滤涉及的记录(因此查询的每个部分涉及的记录较少)。如果可能,请从可以使用简单 WHERE 子句过滤掉最多记录的表开始。

          【讨论】:

            【解决方案6】:

            尝试在执行您的选择之前作为查询运行:

            SET SQL_BIG_SELECTS=1
            

            这真的是在一个巨大的数据集上执行的吗?如果不是,这应该以不同的方式解决。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-11-01
              • 1970-01-01
              • 1970-01-01
              • 2018-10-01
              • 2020-02-12
              • 1970-01-01
              相关资源
              最近更新 更多