6


1

MySQLのMAX_JOIN_SIZEエラー

私はこの問題を抱えている私のユーザーの小グループを代表してこの質問をしています。

使用しているスクリプトが21番目のIDに到達すると、次のエラーが発生します。

_ SELECTはMAX_JOIN_SIZE行以上を調べます。あなたのWHEREをチェックし、SELECTが問題なければSET SQL_BIG_SELECTS = 1またはSET SQL_MAX_JOIN_SIZE =#を使用 _

私は可能な限りこれを調査し、答えの何かを見つけました:http://dev.mysql.com/doc/refman/5.0/en/set-option.html

問題は、彼らが共有ホスティングを利用しているため、エラーを修正するためにMySQLの設定を変更できないことです。

この問題が発生しないようにスクリプトに記述できるものはありますか

これは、ロードされているモジュールに基づいてデータベースクエリを生成する関数です。$ sql = 'SELECT a.idをid、a.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();

2 Answer


13


`+ MAX_JOIN_SIZE +`は、共有ホスティングで一般的に使用される安全策です。

サーバーをハングさせるような長いクエリを誤って実行させることはありません。

このコマンドを発行して下さい:

SET SQL_BIG_SELECTS = 1

クエリを実行する前に、たくさんの値を返すことがわかっています。


4


MySQLがジョインのデカルト積を計算するときにMAX_JOIN_SIZEがヒットします。実際の予想レコードは返されません。 したがって、巨大なテーブルを別の巨大なテーブルに結合している場合、これは忍び寄るでしょう。 それが本当にそれほど大きい場合は、インデックスとビューを使用してテーブルヒットの可能性を少なくします。

詳細はこちら: MySQL - SQL_BIG_SELECTS