문제

이 문제가있는 소수의 사용자 그룹을 대신 하여이 질문을하고 있습니다.

사용중인 스크립트가 21 번째 ID에 도달하면 다음 오류가 발생합니다.

SELECT는 Max_Join_Size 행보다 더 많은 것을 검사합니다. 위치를 확인하고 사용 설정 SQL_BIG_SELECTS = 1 또는 SELECT가 괜찮은 경우 SQL_MAX_JOIN_SIZE =# 설정하십시오.

나는 이것을 가능한 한 많이 연구하고 답을 찾았습니다. http://dev.mysql.com/doc/refman/55.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();
도움이 되었습니까?

해결책

MAX_JOIN_SIZE 공유 호스팅에서 일반적으로 사용되는 안전 캐치입니다.

실수로 서버를 걸 수있는 긴 쿼리를 실수로 실행할 수는 없습니다.

이 명령 발행 :

SET SQL_BIG_SELECTS = 1

쿼리를 실행하기 전에 많은 값을 반환하는 것을 알고 있습니다.

다른 팁

MySQL이 실제 예상 레코드가 아닌 Join의 직교 제품을 계산할 때 Max_join_size는 적중합니다. 따라서 거대한 테이블을 다른 거대한 테이블에 결합하면 이렇게됩니다. 인덱스와보기를 사용하여 가능한 테이블 히트를 실제로 크게 줄이십시오.

자세히보기 : mysql -sql_big_selects

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top