我正在使用PHP和MySQL。在我的程序中有一个涉及连接的选择查询。当我在localhost上运行它时工作正常但是当我在服务器上传它并尝试执行它时会产生以下错误:
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
我该如何纠正?
答案 0 :(得分:21)
使用PHP时,应在主查询之前在单独的查询中设置SQL_BIG_SELECTS = 1。例如:
$mysqli = new mysqli("localhost", "root", "password", "db");
$mysqli->query("SET SQL_BIG_SELECTS=1"); //Set it before your main query
$results = $mysqli->query("SELECT a, b, c FROM test");
while($row = $results->fetch_assoc()){
echo '<pre>';
print_r ($row);
echo '</pre>';
}
答案 1 :(得分:11)
尝试在执行您的选择之前作为查询运行:
SET SQL_BIG_SELECTS=1
这是否真的在庞大的数据集上执行?如果不是,这应该以不同的方式解决。
答案 2 :(得分:3)
参数的效果记录在http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_max_join_size。
您应该更严格地过滤相关记录(因此查询的每个部分都涉及的记录较少)。如果可能的话,从表中开始,您可以使用简单的WHERE子句过滤掉大多数记录。
答案 3 :(得分:0)
我遇到了同样的问题。它是一个drupal网站,所以毫不奇怪它倒下了。
这是旧式查询,即Select blah From table1, table2, table3 Where table1.id=table2.id And table2.some = 'thing'
就像@VolkerK所说的那样,解决方案是将table2结果的where子句移动到匹配table1到table2之前的where(实际上是join子句),从而减少需要在table2和table1中匹配的记录数量。
答案 4 :(得分:0)
对我来说,解决方案是为连接用于匹配的所有列添加索引键。
答案 5 :(得分:0)
如果您使用的是PDO驱动程序,请在构建新的数据库句柄时在 driver_options 数组中设置PDO::MYSQL_ATTR_INIT_COMMAND
$dbh = new PDO('mysql:host=xxx;port=xxx;dbname=xxx', 'xxx', 'xxx', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET SESSION SQL_BIG_SELECTS=1'));