문제
이 문제가있는 소수의 사용자 그룹을 대신 하여이 질문을하고 있습니다.
사용중인 스크립트가 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