MySQL的使用max_join_size错误
-
12-09-2019 - |
题
我问代表一小我的用户有这个问题的这个问题。
在他们正在使用的脚本获取到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为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();
解决方案
MAX_JOIN_SIZE
是一个安全锁销上的共享hostings常用。
它不会让你意外地运行长查询,这将挂起服务器。
发出此命令:
SET SQL_BIG_SELECTS = 1
运行查询之前,你知道要返回大量的值。
其他提示
在MySQL的计算的加入,而不是实际的预期记录回笛卡尔积的使用max_join_size被击中。因此,如果你要加入一个庞大的表到另一个大规模的表,这将攀升。使用索引和视图,大肆削减可能打表,如果它真的那么大。
请参阅更这里: MySQL的 - SQL_BIG_SELECTS
不隶属于 StackOverflow