2009-06-08 4 views
6

이 문제가있는 소수의 사용자를 대신하여이 질문을하고 있습니다. 나는 가능한이 많이 연구되고 응답의 무언가 발견MySQL MAX_JOIN_SIZE 오류

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

: http://dev.mysql.com/doc/refman/5.0/en/set-option.html

을 그들이 사용하는 스크립트가 21 ID에 도달하면

, 그것은 다음과 같은 오류가 발생합니다 문제는 공유 호스팅에 있기 때문에 오류를 수정하기 위해 MySQL 설정을 변경할 수 없다는 것입니다.

스크립트에이 문제가 없도록 쓸 수있는 것이 있습니까?

로드 된 모듈을 기반으로 데이터베이스 쿼리를 생성하는 함수입니다. $ sql = 'id로 a.id를 선택하고 주소로 a.address'; MySQL은 A, 가입하지 실제 예상 기록을 다시의 직교 제품을 계산할 때 MAX_JOIN_SIZE은 당한다

 $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(); 
+0

쿼리가 최적화되어 있는지, 즉 더 적은 중간 결과 집합으로 동일한 결과를 얻을 수있는 방법이 없다고 확신합니까? – VolkerK

답변

13

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

실수로 서버를 정지시키는 긴 쿼리를 실행할 수 없습니다.

문제점이 명령을

SET OPTION SQL_BIG_SELECTS = 1 

당신이 값을 많이 돌아 알고있는 쿼리를 실행하기 전에.

4

. 따라서 거대한 테이블을 다른 거대한 테이블에 조인 할 경우, 이것은 크게 늘어납니다. 인덱스와 뷰를 사용하여 가능한 테이블 히트 수를 줄이십시오.

은 자세한 내용은 여기를 참조하십시오 : MySQL - SQL_BIG_SELECTS