MySQL - SQL_BIG_SELECTS

时间:2009-06-04 13:07:36

标签: mysql select

嘿,我一直在调查SQL_BIG_SELECTS,但到目前为止MySQL文档一直没有用。我正在寻找一些见解,以防止出现如下所示的错误。

  

错误1104:SELECT会检查太多记录,可能需要很长时间。   如果SELECT正常,请检查您的WHERE并使用SET OPTION SQL_BIG_SELECTS = 1

  1. MySQL确定查询是“BIG SELECT”多少行?
  2. 正确的索引通常会解决这个问题吗?
  3. SQL_BIG_SELECTS被认为是“最后的手段”,还是优秀的做法?
  4. 如何在配置中设置“SQL_BIG_SELECTS = 1”(无需执行查询)?
  5. 还有其他值得了解的选择吗?
  6. 提前致谢!

6 个答案:

答案 0 :(得分:39)

  1. MySQL根据“max_join_size”的值确定查询是否为“大选择”。如果查询可能必须检查超过此行数,则会将其视为“大选择”。使用'show variables'查看最大连接大小的值。

  2. 我认为索引和特别好的where子句可以防止出现此问题。

  3. SQL_BIG_SELECTS用于防止用户意外执行过大的查询。可以在mysql.cnf中将其设置为ON或在启动时使用命令行选项。

  4. 您可以在my.cnf或服务器启动时设置SQL_BIG_SELECTS。它也可以使用SET SESSION SQL_BIG_SELECTS=1在会话基础上设置。

  5. 不是我能想到的。我会检查您的查询以确保您确实需要使用它。我们的服务器默认打开它,而max_join_size非常大。

答案 1 :(得分:2)

无法在my.cnf或服务器启动时设置SQL_BIG_SELECTS,因为它只是一个会话参数。我使用的是MySQL 5.0.60。

答案 2 :(得分:1)

如前所述有人发帖,您无法在服务器启动时在my.cnf上设置SQL_BIG_SELECTS。这种变量不支持。

我在Symfony应用程序中遇到同样的问题,显示出这个恼人的错误:

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

但你可以增加变种的数量

max_join_size与sql_big_selects相关

我能够修复它作为特权mysql用户执行命令:

# SET GLOBAL max_join_size=18446744073709551615;

或者您可以将其包含在my.cnf中,因为允许在配置文件中设置max_join_size

嗯,我希望这可以帮助别人。

答案 3 :(得分:0)

以下命令适用于我

SET GLOBAL max_join_size=18446744073709551615;

但是我需要在my.cnf文件中添加什么而不是命令? 顺便说一下,我正在使用“5.6.12 MySQL社区服务器”

答案 4 :(得分:0)

我在db中有超过2000k的记录,我的查询是大选择,详细比较删除重复和某些字段的更新...我被mysql告知了同样的事情(当前版本在答案日期) ),我最终在index条款涉及的2个字段上使用where ...这也应该对其他人有所帮助......对我有用的步骤是:

  1. 在字段
  2. 上设置索引
  3. 分析表
  4. 运行查询
  5. HTH

答案 5 :(得分:-1)

SET SESSION SQL_BIG_SELECTS =1;# MySQL returned an empty result set (i.e. zero rows).
SELECT a.`HACtrl` , b.`HBCtrl` , c.`HDCtrl`
FROM `HO110BLote` AS a
LEFT JOIN `HO113BPago` AS b ON ( b.HBHACtrl = a.HACtrl )
LEFT JOIN `HO113BRecibos` AS c ON ( c.HDHBCtrl = b.HBCtrl )
WHERE HAManzana = '03'
AND HALote = '09'
LIMIT 0 , 100