【问题标题】:MySQL MAX_JOIN_SIZE errorsMySQL MAX_JOIN_SIZE 错误
【发布时间】:2010-11-01 07:06:04
【问题描述】:

我代表我的一小部分有此问题的用户提出此问题。

一旦他们使用的脚本到达第 21 个 ID,就会产生以下错误:

SELECT 将检查超过 MAX_JOIN_SIZE 行;检查你的 WHERE 并使用 SET SQL_BIG_SELECTS=1 或 SET SQL_MAX_JOIN_SIZE=# 如果 SELECT 是 好的

我对此进行了尽可能多的研究并找到了一些答案:http://dev.mysql.com/doc/refman/5.0/en/set-option.html

问题是他们在共享主机上,所以他们无法更改他们的 MySQL 设置来修复错误。

有什么我可以写到我的脚本中以便他们没有这个问题的吗?

这是根据加载的模块生成数据库查询的函数: $sql = 'SELECT a.id as id , a.address as address';

        $query  = 'SELECT'
                . ' name AS module_name'
                . ', databasename AS module_database'
                . ', pregmatch AS module_pregmatch'
                . ', pregmatch2 AS module_pregmatch2'
                . ', html AS module_html'
                . ', sqlselect AS database_sqlselect'
                . ', sqljoin AS database_sqljoin'
                . ', sqlupdatewithvalue AS database_sqlupdatewithvalue'
                . ', sqlupdatenovalue AS database_sqlupdatenovalue'
                . ' FROM #__aqsgmeta_modules'
                . ' WHERE enabled = 1'
                . ' ORDER BY id';                       
        $db->setQuery($query);
        $results = $db->loadObjectList();
        if (count($results) != 0) {
            foreach ($results as $result) {
                $sqlselect .= ', ';
                $sqlselect .= $result->database_sqlselect;

                $sqljoin .= ' ';
                $result->database_sqljoin = preg_replace('/\{DATABASENAME\}/Ui', $result->module_database, $result->database_sqljoin);
                if (!(preg_match("/" . $result->database_sqljoin . "/Ui", $sqljoin))) 
                    $sqljoin .= $result->database_sqljoin;
            }
        }

        if ($use_sh404sef)
            $sqlselect .= ', g.oldurl AS sefurl';
        $sql .= $sqlselect;
        $sql .= ' FROM #__aqsgmeta_address AS a';
        $sql .= $sqljoin;

        if ($use_sh404sef)
            $sql .= ' LEFT JOIN #__redirection AS g ON g.newurl = a.address';

        $sql .=
        //. ' WHERE a.id IN (' . $cids . ')'
        ' WHERE a.id = ' . $id
        . ' ORDER BY a.address asc,a.id '
        ;
        $db->setQuery($sql);
        $rows = $db->loadObjectList();

【问题讨论】:

  • 您绝对确定查询已经过优化,即没有办法用更少的中间结果集获得相同的结果?

标签: mysql shared-hosting


【解决方案1】:

MAX_JOIN_SIZE 是共享主机上常用的安全锁。

它不会让您意外运行导致服务器挂起的长查询。

发出这个命令:

SET SQL_BIG_SELECTS = 1

在运行查询之前,您知道要返回很多值。

【讨论】:

  • 我认为你需要在“变量”前面加上@@
【解决方案2】:

当 MySQL 计算连接的笛卡尔积时,MAX_JOIN_SIZE 被命中,而不是实际的预期记录。因此,如果您将一张大桌子连接到另一张大桌子,这将会蔓延。如果表真的那么大,请使用索引和视图来减少可能的表命中。

在此处查看更多信息:MySQL - SQL_BIG_SELECTS

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    相关资源
    最近更新 更多