MySQL – SQL_BIG_SELECTS

嘿,我一直在调查SQL_BIG_SELECTS,但到目前为止MySQL文档已经相当无益。 我正在寻找一些见解,以防止像下面的错误出现。

错误1104:SELECT会检查太多logging,可能需要很长时间。 检查你的WHERE并使用SET OPTION SQL_BIG_SELECTS = 1如果SELECT是好的

  1. MySQL有多less行决定查询是一个“BIG SELECT”?
  2. 适当的索引通常会解决这个问题吗?
  3. SQL_BIG_SELECTS是否被认为是“最后的手段”,还是很好的做法?
  4. 如何在configuration中设置“SQL_BIG_SELECTS = 1”(不必执行查询)?
  5. 有其他的select值得了解吗?

提前致谢!

  1. MySQL根据“max_join_size”的值确定查询是否为“大选”。 如果查询可能需要检查超过这个数量的行,它会认为它是一个“大选”。 使用“显示variables”查看最大连接大小的值。

  2. 我相信,索引和特定的一个好的where子句可以防止这个问题的发生。

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

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

  5. 不是我能想到的。 我只是检查你的查询,以确保你真的需要使用它。 我们的服务器默认开启,max_join_size非常大。

不能在my.cnf或服务器启动时设置SQL_BIG_SELECTS ,因为它仅是会话参数。 我正在使用MySQL 5.0.60。

由于以前有人发帖,您不能在服务器启动时在my.cnf上设置SQL_BIG_SELECTS。 这种variables不支持。

我遇到了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 

但是你可以增加varialbe的数量

与sql_big_selects有关的max_join_size

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

 # SET GLOBAL max_join_size=18446744073709551615; 

或者你可以在my.cnf中包含它,因为max_join_size是允许在configuration文件中设置的

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

以下命令为我工作

 SET GLOBAL max_join_size=18446744073709551615; 

但是,我需要把my.cnf文件,而不是命令? 顺便说一句,我使用“5.6.12 MySQL社区服务器”

我有超过2000k的logging在数据库中,我的查询是大select与详尽的比较重复删除和某些领域的更新…我被告知同样的mysql (当前版本的答案date),我结束了使用index涉及where子句的2个字段…这也应该可以帮助其他人…为我工作的步骤是:

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

HTH

 SET SESSION SQL_BIG_SELECTS =1;# MySQL returned an empty result set (ie 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